I was connecting with an executive who wanted a certification program for lead developers to become architects. I wanted to understand the intent behind this and asked why are not they able to grow into their roles without a heavy weight training. His answer was, “If a nurse assists a surgeon in 100 surgeries, will the nurse be eligible to become a surgeon without being trained and certified as a surgeon?”.

It was a nice try, but in reality how many nurses have become a surgeon. All architects are developers, they always grow from being a developer into an architect. It is never a comparison. This also brings the question, is an architect a developer even if the architect does not write code? Yes; to start with, a solution with no custom code is the best code ever written. Having said that, code is the blueprint of an application and anyone impacting the blueprint is in an architect or a developer.

Photo by Christina Morillo on Pexels.com

Software industry is plagued with under training of developers with architecting skills especially softer skills like communication, time management, negotiation etc. Instead almost all focus is given to develop their coding skills to act as a replaceable coding unit who will unquestioningly pick up a task assigned and take it to completion irrespective of what the impact it will create. This defocus removes the developers from being aware of the domain, work with business/product to suggest alternatives.

Whenever I onboard trainees or juniors into my teams, I spend the extra effort to push them to see themselves as an architect. It looks like a formidable uphill task for them, most of them are quick to adapt, catapult their career and have a fulfilling experience. I too benefitted from this attitude by my lead very early in my days. I was told to ask for measurable business results on whatever task I was about to pick as a developer, that one question acted as a guiding light.

Every developer is an architect, every architect is a developer. It is just the experience that varies, it is not akin to nurses becoming doctors when they gain experience.

I started my career with a waterfall style development taking a finished product after extensive quality control to the customer. Release was a major event, marked in our calendar where no one can take days off and the weekends are taken for granted that you will be at work. People spent a considerable amount of time on go/no-go calls and then a marathon effort to make a release happen. The releases were also followed up by hotfixes, bugfixes and minor enhancements which took a toll on the people making it happen.

We think waterfall is extinct now but it is not. There is still a great fear in releasing software to end users. We have progressed so much in software development that a lot of boiler plate is getting taken care by frameworks/tools, extensive automation capabilities help remove toil, abstractions and off the shelf components make it possible to develop and deliver something in matter of days and weeks not in months and years. Combine this with tech practices advocated by XP, we have a very agile tech team.

Photo by Pavel Danilyuk on Pexels.com

No matter what agility comes in technology, the inertia from the business and the product always robs the advantage of agility especially in mid and large organisations. Product teams always want to put a finished product in front of the customer that will wow them, in reality software development never sees a finished product, you just stop giving updates. Tech teams are capable to ship smaller increments of product, in a great frequency in the order of multiple times a day. In a mature continuous delivery enabled team setup, every commit or merge can go to prod within an hour.

Should we call each deployment as a release then. Deployment is a increment to the software, release is a logical grouping of many increments. Branch by abstraction will safeguard existing functionality while new increments are getting delivered and it will be a matter of another small increment to consider it as a release.

I have worked with some teams where the lines blurred, there were only deployments and no releases. One such team had to revamp a user profile page which aimed to declutter the UX and make it more easy to use. The team put a toggle button to preview the under construction page on the current user profile saying “we are revamping the page and let us know how it is coming along”. The designer also asked for feedback from the end user by providing comment ability on the new screen. Along with the comments, analytics was also baked in the new page to learn from user behaviour. This led to super fast iterations of the design as the feedback was instant and from real customers who use the product every day.

Coming back to the inertia from the product to go with a release mindset, this rots the continuous delivery mindset and quickly the teams align to a release mode making it slow, effort intensive and tiring. Decouple releases and deployment, product evolution is supported only when you can iterate as fast as you wish.

I regularly interact with a wide variety of candidates right from college graduates to very senior engineers, one story that I keep hearing is that every one prepares a lot for the interviews solving DSA problems. It is like rote learning, one has to keep practising a lot just for the interviews.

I have never understood the need to test the depths of programming for regular software development. Software development in most cases require skills that does not need deep understanding of data structures and algorithms. A fundamental knowledge of programming is enough. What is needed is communication skills, it is extremely hard to specify software requirements in writing just like how input and output are expressed in competitive programming.

Photo by Nemuel Sereti on Pexels.com

A programmer’s biggest challenge is to understand the value and intent behind a requirement, what impact it can create for the business and come up with a solution that is easy/quick to develop, maintain and extend. The main point here is, it should be fast/easy, cheap to develop/extend, should be maintainable and not be hard to fix when critical flaws like zero days surface. Communication, discipline on keeping up with clean code, grit to keep the code continuously tested, integrated and deployable are key skills. Product owners will need multiple iterations and increments to get to a desired state; faster and easier the communication then faster is the desired result.

A big myth in hiring space is that if programmers are good with DSA, then we can throw any problem and a deadline at them and we can achieve a lot. This mindset is the root cause of a lot of software rot, making it extremely hard to onboard new developers and keep existing developers productive. My observation has been that candidates tuned so well to crack DSA problems expect clear specifications often broken down to LLD and tasks with clear input and output. They find it very hard to collaborate with peers or train new developers. When they face ambiguity, they go haywire instead of resolving it; often end up treating it like competitive individual sport whereas software development is a complex creative process.