Being good at any job is a focus on the work at hand and doing it well. Being great at what you do, is both the ability to complete the job to a very high standard and, to have the character to share, understand and communicate every step along the way, supporting and inspiring others in the team.
Software engineering is much like physical engineering. Having an understanding of how a car works and how to repair or paint it is not the same thing as being an engineer at Lexus. Engineers have a proper mathematical basis for their decisions, yet must be pragmatic compromisers.
Engineers have a mathematical basis for what they do. They don't just throw some paint on or hammer out a dent and call it a day. The shape of the body is carefully designed to be aerodynamic and crash-safe, the materials chosen are designed to at least guarantee durability for the desired lifetime of the product, etc.. Similarly, software engineers have formal bases for what they do. Whether it's something like map-reduce from Google, Fourier transforms in JPEG/MPEG formats, or categorical structures like Functors for semantically combining logic, code is not simply slopped together and pushed to production. It is inspired by and faithful to mathematics.
Engineers must compromise. Engineers are not mathematicians. Their job is not merely to imagine solutions, but to craft them into hard reality to be used by real people. Unlike math, this requires pragmatic nuance at every turn: compromises which require a clear understanding of the final product, its purpose and, its use. For example, how should we choose an image format to serve to our users? An artistic audience may demand a high degree of visual fidelity, while a general audience would much prefer speedy load times. A software engineer must understand both what the product audience desires and what technical choices can satisfy those desires.
Engineers eliminate bugs by design. Anyone can make a mistake, but there is a difference between making a mistake and building something incorrectly in the first place. Having paint chips visible because a second paint job was sloppily thrown on without properly stripping and cleaning first is not a mistake. The same is true for software: most software bugs are not a testament to human error; they are a red flag that the software was not properly engineered in the first place. Properly engineered software utilizes type systems and unit tests to ensure correctness of logic ("does what I wrote even make logical sense?") and behavior ("does what I wrote do what I intended?").
Along with being able to have great knowledge in the field, a great software engineer stands out, through their ability to communicate, in writing and verbally. Having the ability to share a vision for what you are doing and being able to communicate it with the rest of the team and get their support in what you want to achieve will make you a great engineer. No person works in a silo, the greatest engineers in history, those who have built the great railroads and bridges, did not sit alone by themselves to create great things. They worked in teams, both large and small, inspiring with the vision and dedication to the quality of an end product. They understand that no one person can create anything by themselves and that each aspect of their work will involve other people. These engineering feats stand the test of time, and although the space in which Software Engineers work is fluid and different to those when railroads and bridges were built, the relationships and character to build something that lasts remains the same. The clarity with which you communicate in person along with the clarity you communicate in your code, the easier it is to come to an understanding, the greater the progress will be. Great software engineers understand that most of the time is spent reading code, in that we read to write new code, the clearer your code is, the easier others will be able to build with and use it.
Every great software engineer will need the patience required to understand that problems will not be solved immediately. That there is no short cut to a great product. Having patience, with any profession, is one further step to greatness. Patience to reflect on the problem being solved and using your experience and skills to add value in a way that is not rushed. All aspects of Software Engineering need an element of reflection and analysis. Creating suitable tests, expanding your knowledge base, stepping through bugs, optimising slow code. Each of these are minor steps to completing a great product. Having patience will allow you the clarity to find the various paths to a solution and an outcome, then to take the right one. In other physical engineering practices, getting a product out to customers was never something that could be done quickly. Yet in our digital world, anyone could patch something together and release it out to the wild. But it takes patience to go through years of practice in order to master your craft. As they say, patience is a virtue, one which great software engineers embody.
A great engineer is a bridge between mathematics and products for the general public. Software is still in the early period of growing pains, not yet a mature craft. The world is rapidly becoming aware of both the perils of sloppy software the endless possibilities of software engineering. Artists and mathematicians imagine the future, but it is engineers who build it. It takes patience, dedication and passion to the craft to become a master.
What belong to approach you can read at our app development page in section Approach
Top comments (0)