AI: A Gift for Junior Developers, a Curse for Tech Leads

Artificial intelligence is revolutionizing software development, making it easier for less experienced developers to write code, generate solutions, and build applications faster than ever before. But as AI lowers the barrier to entry, it creates an unexpected challenge—an increasing burden on tech leads who must navigate a landscape filled with AI-assisted code that often lacks structure, scalability, and maintainability.

The Rise of AI-Assisted Development

Tools like GitHub Copilot, ChatGPT, and other AI-powered coding assistants have significantly boosted developer productivity. Junior and mid-level developers can now produce complex code snippets, automate repetitive tasks, and solve problems they previously struggled with. While this sounds like a win for the industry, the reality is more nuanced.

AI-generated code is often syntactically correct but semantically flawed. It may work in isolation but lack architectural integrity when integrated into a broader system. AI lacks the human intuition necessary to understand business logic, future scalability, and team-specific best practices. This means that while development velocity increases, so does the risk of accumulating technical debt.

The Burden on Tech Leads

Tech leads, already responsible for guiding teams, making architectural decisions, and ensuring high code quality, now face an additional challenge: reviewing and correcting AI-generated code. Here’s why AI can be a curse for tech leads:

1. Increased Review Workload

AI accelerates code production, but not always in the right direction. More code means more pull requests, more code reviews, and more debugging. Tech leads spend significant time analyzing whether AI-assisted code is functionally correct and adheres to best practices.

For example, a junior developer might use AI to generate an API endpoint for handling user authentication. The AI might produce working code but fail to implement essential security measures such as rate limiting, input validation, or proper session management. The tech lead must then review, refactor, and educate the team on why these aspects are critical.

2. Poor Architectural Decisions

Junior and even mid-level developers often rely on AI to solve immediate problems without considering the long-term architectural impact. AI doesn’t inherently enforce good design patterns, leading to monolithic structures, poorly optimized queries, or brittle integrations that tech leads must later refactor.

Imagine a situation where AI generates multiple SQL queries inside a loop instead of optimizing them into a single batch query. While the code functions correctly, it causes unnecessary database load, which can lead to performance bottlenecks in production. A tech lead must identify and correct such inefficiencies before they escalate.

3. False Confidence in AI Solutions

Developers using AI often assume the generated code is correct because it “works.” However, AI does not understand the nuances of business requirements, security concerns, or industry-specific regulations. This creates hidden bugs and vulnerabilities that tech leads must catch before they become production issues.

For instance, an AI-generated function might handle user passwords but store them in plaintext instead of hashing them properly. If a less-experienced developer deploys this code, it could lead to a serious security breach. A tech lead must not only fix the issue but also implement processes to prevent similar mistakes in the future.

4. AI-Driven Technical Debt

Without proper oversight, AI can rapidly generate unmaintainable code that accumulates as technical debt. Tech leads must dedicate additional time to reworking solutions, refactoring poor implementations, and ensuring code consistency across the codebase.

Consider a scenario where an AI tool generates dozens of functions across different files with inconsistent naming conventions and redundant logic. While the code technically works, it becomes difficult to navigate, update, or debug. A tech lead must step in to unify the code, remove duplication, and enforce better organizational practices.

The Future: More Tech Leads, Not Fewer

Paradoxically, as AI tools become more advanced, the need for strong technical leadership increases. More tech leads will be required to:

  • Establish clear coding guidelines and best practices for AI-assisted development.
  • Educate teams on AI’s limitations and how to critically assess its output.
  • Enforce architectural principles to prevent the system from collapsing under its own complexity.
  • Prioritize code quality and long-term maintainability over short-term gains.
  • Introduce automated testing and linting rules to catch common AI-generated mistakes before they reach production.

How Tech Leads Can Adapt

To thrive in this AI-assisted environment, tech leads need to adjust their approach to leadership and mentorship. Some strategies include:

1. Establish AI Review Processes

Tech leads should implement specific review processes for AI-generated code, ensuring that every piece of code passes through a structured evaluation. Code review checklists should include:

  • Security best practices (e.g., input validation, authentication measures).
  • Performance optimizations (e.g., avoiding redundant queries or inefficient loops).
  • Maintainability and readability (e.g., clear variable names, well-structured functions).

2. Promote AI Literacy Among Developers

Instead of discouraging AI use, tech leads should train their teams to use AI responsibly. This means educating developers on when to trust AI-generated code, how to refine prompts to get better results, and how to critically evaluate AI suggestions.

3. Use AI to Help, Not Replace, Thoughtful Engineering

Tech leads can leverage AI themselves—not just to generate code, but to automate tedious tasks like refactoring, documentation generation, and code linting. By integrating AI into CI/CD pipelines, tech leads can ensure AI-generated code is continuously checked for quality issues before deployment.

AI is undoubtedly a powerful tool for accelerating development, but it is not a substitute for experience, intuition, and thoughtful engineering. While junior developers benefit from AI assistance, tech leads bear the responsibility of ensuring that AI-generated code aligns with best practices and long-term business objectives. As AI continues to shape the industry, the role of tech leads will become even more critical—not just in fixing what has been done, but in guiding teams to use AI responsibly and effectively.

In the end, AI doesn’t replace the need for great engineering—it amplifies the need for strong technical leadership. The companies that recognize this will be the ones that successfully integrate AI into their development processes without sacrificing code quality, security, or scalability.

Decisions, decisions, decisions

Year 2020 has taught us many things but not everyone was listening to the lectures. We are living in constantly evolving world and no matter how much we want to standardize our lives and how much we hate changes they happen all the time. Last year really showed us we cannot control the future and not even shape it based on our needs.

This year should be different they say, there is a lot of hope but are there a lot of people who are willing to adjust to changes constantly. We love our comfortables lives and we don’t want to take step back even if this would take us two or more steps forward in the future. I understand change is hard so hard we sometimes manage to distinguish between common sense and what we want to believe. Internet has evolved and managed to bring those distortion further than ever.

I’ve decided to start writing about life, then changes that are ever lasting, the planning that make solid plans for the future, how to test our plans and how to get out and reach as many people possible with our plan. Whether this is a personal self improvement or a business idea.

I have entered into third decades of working with technology, turning ideas into reality, making those ideas available to broad public, see what works and what it doesn’t. I did learn a lot but I did a lot of mistakes as well. I think this is the decade I want to share my knowledge and experience with others so they can save some time on their own path.

Realizing new ideas has nothing to do with earning a lot of money or becoming famous, they are just a byproduct of a successfully launched and realized ideas. The ideas that solve people’s problem achieve success and it just depends on you how far it takes you to understand if your idea does really solve any problem at all.

Homebrew: How to start and stop background services

Anyone that has installed application running in the background from Homebrew, knows how to use launchctl that actually runs every application when the computer restarts. It is pretty straight forward task but most of the time you need to know the location of the .plist file that defines how to run it installed with homebrew.

Now there is a quicker path how to control them by simply adding following package to home-brew:

brew tap gapple/services
 And you have available to start, stop services directly from home-brew with following command to get a list of active services:
brew services list
So for example if you have installed postgresql you can start it as a background service with:
brew services start postgresql
or stop the service with
brew services stop postgresql

Which is much more easier and simpler than finding the right .plist file inside cellar folder of brew

Stop procrastinating! How to prevent it.

Still trying to stop procrastinating?

stop procrastinating

There are probably numerous days that you site behind the computer to do some research or get some work done and doing a short break to read some news or check social updates and as you done this you aren’t aware that time passes as you jump from one link to another while the time is passing by rapidly. You have probably tried many things, like avoiding to use those sites, setting time aside for short breaks or some other solution but every time you spend more time doing nothing than to spend that time into something productive.

My way of curbing procrastination time to minimum

You probably procrastinate as everyone but you don’t do it so efficiently, there are many ways to curb this behavior especially with avoiding reading the news updates all the time. We live in an era of information overload and we developed a habit of a need to be constantly updated with latest updates.

I am using few tools which are completely free of cost for basic usage you will need to prevent procrastination. Here is how I do it:

I have installed self control app on my computer and you can get it at this link. It is free of cost. Basically what it does is that you add a list of web sites that you want to block for a selected period of time.

You are probably wondering now which pages should I add to this blacklist. Well the obvious sites should be the social networks. Most of the links we click to other sites are coming from there to funny videos or interesting stories. There are ton of these sites, but major one should be Facebook, Twitter, Google+ etc. Though have in mind if you develop for social network logins you have to keep alert to remove them for that period otherwise you can do no related work to it for that day. Other useful list of sites that need to be blacklisted are on your history list in your favorite browser. Go through the history and check all the sites that shouldn’t be there during your work hours and add them to the list.

Next step is to add time inside self control for how long it should be blocked. First advice never do mistake and set it over 24 hours. Perfect time to set the limits is 10-12 hours. You would probably say I don’t work so many hours and I agree you mustn’t but from the time you set the time and all other chores you need to do during the day believe me that is the most optimal time especially if you are working for yourself or being in a startup environment. It is dynamic over the day so keep on tracking your time that way.

So next step is to activate the self control and you magically stop procrastinating. Wrong. Keep on reading.

Continue reading “Stop procrastinating! How to prevent it.”

AngularJS ngInclude directive and scope inheritance

ngInclude directive and scope

There are many times when you want to include a html snippet code from another file but preserve the scope of it. It is usually when you have different form fields for the various objects and you want to have a global controller that oversees the updating of different forms. So if you want to take the quickest route and use ngInclude directive you would be surprised that it is not properly linking to your controller and you cannot access the form instance.

This is due to ngInclude internals and how they work. ngInclude creates for each use as a new child scope so overwriting anything inside the new included HTML file content will be written into child scope and not in the one you’ve anticipated to be. So there are few workaround around this as creating a new object inside the scope for example

$scope.data = {}

inside the controlling controller and then in the imported html file set values inside the

<input type="text" ng-model="data.name"/>

This works if you don’t have a problem with static value being inserted into all html files, but if you want maximum flexibility then this is not the perfect solution. So after inspecting the source code inside ngInclude.js, I have seen a room for improvement and created a similar directive to ngInclude called ngInsert, which instead of making new child scope it inherits the current scope and continue using it inside. You can pick up the whole source code at this gist. You can use it in the same manner as existing ngInclude. Continue reading “AngularJS ngInclude directive and scope inheritance”

Extending Javascript objects with a help of AngularJS extend method

Multiple ways of extending javascript objects

/**
 * One-way reference from subclass to superclass (instance)
 * Most of the time this is what you want. It should be done
 * before adding other methods to Subclass.
 */
ChildClass.prototype = new SuperClass();
 
/**
 * Two-way reference
 * Superclass will also get any Subclass methods added later.
 */
ChildClass.prototype = SuperClass.prototype;
 
/**
 * Cloning behavior
 * This does not setup a reference, so instanceof will not work.
 */
angular.extend(ChildClass.prototype, SuperClass.prototype);
 
/**
 * Enhancing a single instance
 * This could be used to implement the decorator pattern.
 */
angular.extend(subClassInstance, SuperClass.prototype);

Be that likable person

Become genuinely interested in other people.

Smile.

Remember that a person’s name is to that person the sweetest and most important sound in any language.

Be a good listener. Encourage others to talk about themselves.

Talk in terms of the other person’s interests.

Make the other person feel important and do it sincerely.

Smile, smile, smile 🙂

AngularJS directive multiple element

How to get AngularJS directive multiple element

You probably know there exists opening ng-repeat-start and finishing directive ng-repeat-end like:

<ul>
 <li ng-repeat-start="user in users">
   {{user.firstName}}
 </li>
 <li ng-repeat-end>
   {{user.firstName}}
 </li>
</ul>

You would think it is a specially made directive that works that way but actually it is not. It is part of any directive so you can use it inside your too. When you create new directory and inside you factory function you need to return an object with multiElement options set to true. This way it will behave same as ngRepeat directive over multiple non nested fields. Small excerpt from ngRepeat.js file denoting this:

var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
  ...
  return {
    restrict: 'A',
    <strong>multiElement: true,</strong>
    transclude: 'element',
    priority: 1000,
    terminal: true,
    ...
   }
}];

From native angularJS directive there are few more directives that support multi element spanning. They are ngIf, ngShow, ngHide and ngSwitch. So by adding multiElement to your custom directive you can make to transclude over angularjs directive multiple elements at the same time. This also comes handy because you can do nesting of multiple elements if they are contained inside another one.

How to record iPhone screen

To record iPhone screen has never been easier

Developing great new iOS application requires not just a usable application, but also a great video presentation of it. How it works, basic usability tricks to make users want to get your new application which you spent numerous hours to make it perfect.

If you are working alone on next big thing or inside a small agency or team and you probably have a limited budget to outsource your video production one of the hardest parts was shooting the actual content from iOS device, whether it is iPhone or iPad. Until now you could use some kind of recording of iOS simulator or using airplay method to sync the video. It worked but it was somehow clunky experience and you needed to buy extra software.

With the release of Mac OS Yosemite version everything has changed. Now you can record you iOS device screen directly without buying additional software whatsoever. All you need to have the computer upgraded to Yosemite version and an iPhone or iPad to latest iOS 8. iOS device needs to connect to your computer through lighting cable.

Continue reading “How to record iPhone screen”