My friends would always joke and say things like: “anyone can program if they had access to a google search bar”. I tend to agree that the internet is a vast ocean of information and one can learn virtually anything they dump their time into if they have the discipline to do so. But real world software engineering usually means working with a team on a variety of different projects that span a large swathe of functionalities and intentions.
One of the aspects of software engineering that demands the most adaptation from the engineer is working asynchronously with others on a single project. I’m sure that most people have had experience working with a plethora of different types of people and particularly found that communication did not always (at least initially) lead to spectacular results. This is where agile project management shines. As each task or implementation on a project warrants its own “issue”. Issues are then assigned collaborators and partitioned into one of three categories: “to-do”, “in progress” and “completed”. This organization structure allows the users to track the changes made to various versions of the main project and commit their modifications in a tangible way. This is especially useful in referencing particular enhancements and even troubleshooting errors that occur. Not everything in software engineering goes according to plan; sometimes a particular commit erroneously causes some functionality of the application to break. Tracking changes to the system allows you to easier identify when a commit breaks the system - either reverting back to that point or fixing the particular branch. The visibility of the issue on a project board further bridges communication of the team, as current, completed and impending tasks are clearly visible and easily comprehensible. Not all commits can be properly communicated during meetings alone and so the project board becomes a vital tool towards cohesively developing towards any upcoming milestones.
Ethics in software engineering will be infinitely debated so long as software engineers exist. The incentive to innovate is to create a new tool that provides valuable information or increases efficiency towards some process. The result of successful tool innovation bears fruit that has inherent value. And this fruit can be used for a variety of purposes - the morality of which is subjective to one’s own moral alignment.
Most technologies - even those developed expressly for the goodwill of others - likewise have a potential for abuse. Though most engineers create with the intention of good or neutrality, there are always those that will utilize these technologies for less than altruistic means or exclaim that another engineer’s work is unjust for
Overall, software engineering is a dynamic skill set that has a variety of applications. Though you could potentially never leave your house and develop the next big technological innovation that shakes the foundation of technology as we know it, the reality is that you will most certainly be working with teams - big or small - and will get the opportunity to create exciting new applications with a variety of people. Communication will likely be your strongest asset to successfully completing a cohesive project and find yourself standing proudly at the finish line.