Ask HN: I've lost faith in myself as a developer, how do I get it back?

318 points by cwitty88 ↗ HN
I've been a software developer for about 12 years, the last 8 of which I have been the CTO of a company that is growing like crazy. Recently I have been doubting every move that I make and have lost all faith in myself as a developer. When I look at a new feature I just think that I will make it shitty or get called out on not doing things the "right" way. The thing is, I know I'm a decent developer but I find myself doubting every single decision that I make. Is this burn out? How can I get out of this funk and move on?

239 comments

[ 3.3 ms ] story [ 147 ms ] thread
Well, look at the positive side, as a CTO you probably don't have much time to code anyway.

Jokes aside, did something happen before? Did a software not perform or caused problems? You say growth is fast. Sounds good and that means to make compromises here and there in software that might not fit your aspirations of quality.

Is this a new position? Or did you see a topic that was just beyond you in any conceivable way? I guess making wrong decisions comes with the job, but as long as business is good...

I've been CTO since the beginning but it was almost all coding in the early days. Now it is much more of a management role. I actually just started the process of stepping down and going back to being a developer because I dislike the management side of things a lot.

I think I am questioning my abilities because we built things in questionable ways and now everything that I have done is being scrutinized by all new team members. It's really hard to deal with that constant barrage of "why did you do it this way" all the time.

>we built things in questionable ways

Classic. I know brilliant people who wrote pretty ugly code years ago and beat themselves up about now (in a tongue-in-cheek way -- they joke about it frequently).

Coding is hard; if it was easy, people as smart as them would've written stuff perfectly the first time!

Humility is very important for coding (most things, really). Everyone writes "questionable" or "ugly" code, so it's important to accept that as much in yourself as you do for others. Think about what you would say to someone else in your position: would you be as critical of them as you are of yourself?

Moreover, in the early days of a new company, the priority is to get something working to create income - sometimes, quality be damned. Otherwise, there's a good chance the company won't survive to get the chance to hire people who will get the opportunity to criticize the code that made their employment possible.

One thing to keep in mind with respect to that - often when teams grow you get more ivory tower types. Not that everyone wants to build an ivory tower, but you do get a lot of in-between. One thing to keep in mind about why the code was the way it was - it was designed that way to grow the company fast and to get customers. Nearly all companies that start that growth will face the inevitable - let's rebuild all of this from scratch. It doesn't mean your original contributions were worthless - no one would be working there if that was true.

In the end you may move more towards explaining to people how the company operates, how the data is processed and keep that going.

I assume you built things in questionable ways because as you said, the company was growing like crazy and there was no time to “do things right”. It just had to work. It sounds like you did a great job if the company is currently doing well.

My only advice is you should be open-minded to the newer devs who work day-to-day with the “legacy” systems you originally wrote and may have very informed ideas about how to improve or refactor those systems. It’s not a knock on you, the company is simply in a different stage.

> everything that I have done is being scrutinized by all new team members. It's really hard to deal with that constant barrage of "why did you do it this way"

Reading old code with a critical eye is an important part of working on a mature code base.

If an arrogant developer reads some questionable code, they will think "the author must have been stupid." They will ask this question as a way to satisfy their narcissism.

If a thoughtful developer finds some questionable code, they will think "the author must have had some motivation that I don't know about." They will ask this question to help them understand the system design and do better work.

Both attitudes lead to the same question. You could start by assuming your new team members are thoughtful and want to learn. They will understand that "we were under time pressure" or "we didn't know about xxxx technique" is a valid answer to "why did you do it this way."

If you discover that your new team members have narcissistic tendencies, then you have a much bigger problem than justifying your own past decisions.

I'm not in a startup, but you should comfortable answering/acknowledging something along the lines of we needed it working quickly, and this did the job for x amount of time based on the time available at the required throughput.

We have the time now for refactoring ... or we'll add a ticket to the backlog, etc.

Second, everyone looks at some code, wonders what idiot did this ... and at some point discovers it was themselves x months/years ago. If you're the primary coder, you'll be getting this a lot. Accept that you've learned and improved since then.

Hope this helps.

Yea that is about right. Given the knowledge and requests I had at the time I solved it the best way I knew how. No one opts for worse it just happens from time-to-time given business constraints.

I all too frequently wonder who wrote this and see that it was me. You're right that it's a good sign of growth :).

Oh I have been in a similar position myself. Was a single dev in a startup and I needed to cut corners. I implemented everything. From embedded controllers to user interface and I even used code that some students wrote as a proof of concept to save time. Codebase was a mess. It worked in the end, but barely and maintenance was horrible.

I demanded help when the product was on the market and the new dev began to refactor parts of the software. Was awesome to have help and the new dev teased me when he discovered my greatest sins and most idiotic decisions that I committed. Wasn't meant seriously from his side, but at some point it nagged on me nonetheless because he was a bit of a smartass at times.

Helped me to reflect what I implemented with the resources and time that I had. You will rarely be happy with the code and design decisions you made yesterday anyway. Learn from the mistake and move on. A dev that never wrote bad code probably didn't write much to begin with. People that constantly question design decisions often might just want to prove themselves to you or honestly want to know why you did it. I often answer something like "I was full of optimism about it at that time".

I had this exact same experience at a previous startup. It was really frustrating to me, it was so easy for new devs joining the team to criticize past work. It was especially difficult for me because I'm not a natural leader and I tend to avoid conflict. On top of that, I already knew I was cutting corners, it's just impossible when I was the only developer and was forced to make tradeoffs and meet deadlines all the time. But the new team members weren't around for those times so they were blind to previous state.

I'm now working for a different startup of very smart people and engineers and see that it's just normal to have all kinds of tech debt. My previous experience has given me valuable perspective, I don't complain about how/why things are the way they are I just do the best I can to improve it and ship features.

Athletes who have a long career will sometimes take time out to reinvent their game. So do some software developers.

Your best bet is to do a project entirely different from anything you've done in a while. You can vary: (1) the domain of the project (what it's about) and (2) the technology behind the project.

When I was really sick and tired of programming I enjoyed playing with Scratch with kids. Many coders, including myself, have a blast with Arduino and other embedded boards.

Sometimes coding just sounds like the worst thing I could possibly do. I do enjoy thinking about writing some code but when I sit down all enthusiasm goes out the door. Maybe I need to tinker with something in the real world tangentially related to code and that will help.
Have you been involved in the code this whole time, or just getting back into it?
Or just find some hobby that has nothing to do with software at all.

Years ago I took the Myers-Britt test and was an INTP. In the last year I picked up an art hobby (with a lot of coding skills) and have been doing a lot of reading and other work relative to art and relationships and I retested as an INFP. Now my heroes are people like Walt Disney and Jim Henson. I wouldn’t be surprised if I test as an ENFP a year from now.

So when that sometimes happen don't force yourself into it. I'd watch some tutorial on YouTube and try to replicate that, watch videos from all angles: game development, frontend tools, 3D graphics, databases, protocols, talks from conferences... whatever comes into your focus.

For me the trick is to just begin, no matter how small the initial step is.

I think what really triggers curiosity is the ability to learn new things while making an okay progress.

Out of curiosity, why are you still coding as the Chief Technology Officer?

I knew some CTO's that wrote the initial code (ergo, code quality totally sucked), or would write a 1-off extension (where the code quality didn't matter much). Once the company achieved some size (>5 developers) they just didn't do it anymore / it wasn't a quality use of their time.

As they matured, they tended to focus on the data schema and the soa architecture, and less on the bits and bytes of functions and frameworks.

What drives you to keep being the primary coder?

Make something yourself, on your own. Show yourself that you've still got it.
CTO and developer separate into distinct roles as a company grows.

How big is this company?

Is it a small company with few developers where you hold the CTO title because you're a founding developer or the most senior developer? If so, you might be missing the reassurance that came from your previous life where you had a manager to check your work, peers to review it, and feedback from people who didn't report to you:

> When I look at a new feature I just think that I will make it shitty or get called out on not doing things the "right" way.

At a startup, the "right" way isn't necessarily the most textbook-perfect code. The right way is getting features shipped as soon as possible with the code being good enough to be understandable, stable, and maintainable. You need to be careful about spiraling into decision paralysis or drawn out refactor iterations and instead focus more on shipping features to users, focusing effort where it matters for the business, and avoiding unnecessary complication in search of perfection. Perfectionism will kill startups slowly.

If you're the CTO of a big company with many developers reporting to you, then it's time to start letting go of the developer responsibilities. Trying to manage the code too closely or trying to insert yourself into the development teams that you're supposed to be managing doesn't work at scale. Focus on the bigger picture: Driving objectives, mentoring developers, hiring, monitoring output, and other leadership roles. Don't let a desire to control the code interfere with your management duties.

The company is growing in all facets. We added 17 engineers this year when we previously had a total team of like 10.

You hit the nail on the head though, I got the role because I was the first engineer and employee at the company. In no way am I a great CTO, just lucky timing.

I'm actually stepping down as CTO and becoming a developer again because I am not a good manager, that I know for sure.

I think I need to be better about getting over perfectionism. I think I let it haunt me that everyone looks up to me with my title as if I should be the best when I am very much not. Thanks for the thoughts here, I really need to reflect on this some more.

That sounds like a good decision. I would greatly respect someone that I saw making this call, far more than if they tried to struggle through and did damage to their own careers or others. Best of luck to you.
I would similarly commend you for the awareness and bravery to step down, but I would offer two notes here:

> In no way am I a great CTO

> I am not a good manager

It sounds to me like one core thing you learned is that good developer != good manager != good CTO. With that said, all three skills are different, but improved in the same way. Practice and with focused attention. It sounds to me like you were still focused on development and never really gave yourself a chance to develop those management and CTO skills.

It may still be the right call to step down, but I would at least consider trying to shift your focus to the other skills instead of development, if a leadership role is of any interest to you long term. You could also step down to a manager role so you can focus on one of the two at a time. If the learning here is that you actually don't want to focus on those skills over development, then nevermind this for the most part :)

You likely know what is best for you, but let me offer the counter argument. Your company's dev resources are growing. You are questioning yourself as a developer. You probably know more about your company's stack than anyone. You are CTO.

I don't know what you want for your future, but many of us have transitioned from dev roles to management. If you are going to be an engineer long-term, then stepping down from CTO may make sense. However, if in the next 5-10 years you want to become "management" then you are going to have to learn how to manage people. You are going to develop less. Your team should be better at developing than you are.

If you eventually want to manage, you will have to learn the skills. So why not focus on getting better at CTO now? You'll be 5-10 years ahead of where you'd otherwise be. CTO roles don't come around every day.

Just my two cents.

That is a courageous choice as others have said. You are ultimately doing the right thing for yourself and others. There is possibly an opportunity in the transition if you are staying with the company to set yourself up with some dev work that will let you recover. Depending on circumstances, a passive handover puts you at risk of landing in an awkward spot.
When I first saw your post, my reaction was: CTO after only 4 years of work experience? I've been coding for 30 years now, working for 20, and only in the last 5-6 years have I felt capable of playing that role.

Kudos that you've taken that decision - it's a good one. You can take the time to really broaden your horizons. At which point I very much expect that you'll go back, but as someone who earned the respect, not someone who needs to demand it.

It sounds like if you were to stay on as CTO you should consider delegating some more of the management, not just the tech. Who in your team can step up to support you? A CTO with 20+ people should be doing low-touch development if at all.

No harm to step down or out for a bit and come back to it when you're ready if you're burned out. Rotating the management and developer duties might reduce your pressure if it makes you feel you've got more back up.

Consider pair programming if you're doubting yourself, maybe with both weaker and stronger developers to help benchmark your skills more accurately.

External training or mentorship might help you to get another perspective on your skillset.

Also consider whether there are any external factors such as your upstream management, clients, or the market that you are in that are stressing you out. It may be that the worries about development skills are symptoms of another issue.

As a senior team member, you should have a lot of scope to choose the work that you think is the best fit for you. Taking some time to think about this is part of being a manager, and as a senior developer your development skills are not something you need to worry about too much - you can bring these up quickly if you need to, and you probably don't need to right now. You've gone through a stage of worrying about what you can bring technically to the table, and that's not your focus right now, which feels uncomfortable. It's OK to follow the flow of your career and see what happens, you can reset down the line if needed.

>I'm actually stepping down as CTO and becoming a developer again because I am not a good manager, that I know for sure.

My suggestion is, DON'T.

Please see my other comment in this thread for some suggestions. Opportunities like this do not come often and it is a mistake to give up what you have achieved without a great deal of deliberate thought.

Do you discuss your technical decisions with your peers? That might give you some validation. I chat all the time with people about what techs to use.
Yea we definitely discuss tech decisions as a group. We didn't in the past though and so some of them are poor decisions that have deep implications in the codebase. We're trying to unwind them now. Maybe that is leading to the feelings I have been having.
I don't just mean with your current org, I mean with your wider network of people who understand the issues. With outsiders you get people who aren't invested in the same way, yet have done similar work.
This article popped up here a while ago and I think about it a lot in context to this exact question: https://zapier.com/blog/actual-impostors-dont-get-impostor-s...

As others have noted I agree that building something (even not software related) helps get me out of these kinds of funks. The reality of your position is that you likely are at a point where you have hired people to make the important technical decisions in terms or architecture, design, and "engineering" and you hired them because they are specialists at that. In todays dev world there is too much to know about to many things to keep full grasp on it all. Your job as a technical leader is to drive the trajectory of the project in the right direction and that often means trusting the leaders of various teams to make decisions about individual technical topics so long as it meets your higher level goals as an organization. Remember Wernher von Braun was not designing every piece of the Saturn V he was driving the project to success.

You could try focussing on other facets of the tech industry, rather than the one you are currently surrounded with.

Meet-ups, hackathons etc are good ways to stay up to date on diverse topics & letting your brain work on new stuff instead.

I miss hackathons, those are fun because the entire purpose is that you're just slamming shit together to make something work in a short amount of time. In the early days that is basically how our entire codebase was.
It does sound like burnout, and also like not being in the right environment (which contributes to burn out). I had one job where there was a lot of technical debt, but my manager did not respect me and my colleagues had what was basically a "learned helplessness" attitude. So I'd go around trying really hard to make things better, but everyone responded to me like I was just crazy or naive or didn't know what I was talking about. Thankfully my previous job had been one where I had earned a lot of respect from my colleagues and managers, so I knew that I wasn't the problem, but even knowing that I found the doubt starting to creep in.

I left. My new job has lots of tech debt, lots of processes that are broken, but when I propose changes people listen. When I put in the work I can see progress. It's hard work and frustrating, but I know that it's because the problems I'm tackling are hard, not because I'm a failure or lacking. That's a very different environment.

I can only give a very broad bit of advice here -- having a positive, open environment is very important. Gaslighting will bring down even the most secure, confident person over time. If you can't change the environment, leaving to find a better one is the right thing to do. What that looks like will differ on one's situation -- might be a long break from coding, might be changing teams, might be changing companies. But we absolutely need people around us who believe in us to work sustainably.

I kinda figured I might be going through some burnout. I have thought about taking a sabbatical to try and recoup from it a bit.

The company itself is great. All of the feedback I receive is very respectful and understanding, it still just eats at me though. We're even working on a plan to address some of the tech debt/complexity in 2022.

I think my self-doubt is just being on a podium at work teamed up with being burnt out. Maybe an extended vacation is really what I need to do.

> Maybe an extended vacation is really what I need to do.

100% adding a +1 here that this sounds like the right thing to do to start.

> it still just eats at me though

To me, this stands out. I think it's important to answer the "why" here at some point, whether that be before/during/after an extended break. Some potential things to investigate:

- Maybe the company is respectful, but the environment is still too critical / focused on bettering code constantly rather than focusing on product.

- Maybe there's too much focus on code quality over product generally, to the point that it's not helpful.

- Maybe it's not actually as respectful and understanding as you originally thought.

- Maybe the way it's delivered works for others but you need a different format and can communicate that need to others.

- Maybe the feedback coming from people below you (reading into "on a podium") is different than from peers and you're internalizing it.

Whatever it is, I hope a break helps you reset and gives you space to figure it out!

I was CTO at a company and ended up managing a team of just under 20 developers and although I didn't feel the same way as you do right now, I did absolutely feel that my technical skills were becoming increasingly rusty. The Javascript revolution passed me by, Typescript was a mystery to me, all sorts of interesting things were happening in the cloud and I just wasn't hands-on with any of it.

Although my management and business skills were continuing to improve (and, I think, got to be quite strong), the loss of my technical competence did bother me. I ended up leaving and now I'm working as a CTO but with no team - more of an individual contributor, at a senior level in the company. I write code every day and over the past year my technical skills have mostly returned, and I've gotten to learn all sorts of exciting new stuff.

With that said, one of the biggest things I've learned is that, once you know how to write software, it's not that hard to get back into it. Learning Typescript has been straightforward. VS Code is a joy to use, but hey, Xcode was pretty great too. If having strong technical skills is important to you, then you have to change your focus and get back into it. But know that you can do this any time you want. On the other hand, if you value the skills of people management, reporting to a board, managing investments, etc., those are things that are hard AND valuable.

At the end of the day it's just about choices, you can't be great at everything. Good luck!

Thanks for sharing your experience. I’m also going through similar issues with gaslighting at my job right now which I attribute to a few insecure colleagues and managers in a heavy tech debt laden environment. It’s done major damage to my self esteem lately. I was feeling very confident as a developer and tech lead until joining the team I’m on now. I’ve been constantly questioning myself lately even though my intuition, which I’ve normally trusted in, is telling me it’s not me, it’s my environment. It’s taught me a lot about my limits to take on constant streams of bullshit and I’m hoping to move on soon and heal the damage. I’m just hoping it’s something that doesn’t haunt me for years to come. What you shared gives me some hope!
It’s taught me a lot about my limits to take on constant streams of bullshit and I’m hoping to move on soon and heal the damage.

Best of luck from someone who's been there! With hindsight you'll be able to draw lessons for self improvement, and also realize just how much really was the fault of your environment, with nothing you could have done differently. Just take some time for yourself and learn what you can, and what to avoid in the future.

(comment deleted)
I left my first job for that reason, management had a complete inability to progress from "it works" to "it works well".
I've seen that happen at more than a few workplaces. It's a very interesting phenomenon, almost like a cultural helplessness that seeps into an environment. The crazy thing is that it only takes one or two people and everyone gets infected eventually. It seems you have to have a very, very strong personal fortitude to resist it.

I think the "sense that you can change things", for which positivity is required, is the single most valuable asset that a company/team/whatever can have.

Yes but why? I mean why bother when it feels like trying to move rocks alone and even if you do you won't get recognition in any form. What can you do if the org just does not get it?

I think moving away makes more sense personally.

> I had one job where there was a lot of technical debt, but my manager did not respect me and my colleagues had what was basically a "learned helplessness" attitude. So I'd go around trying really hard to make things better, but everyone responded to me like I was just crazy or naive or didn't know what I was talking about.

This is the sad truth at way too many orgs, even YC funded ones. Several times I have come in as a "highly respected CTO", and the things I end up doing that work are simply the same things the previous CTO was trying to do, but he/she wasn't able to get buy-in because of lack of respect from the non-technical parts of the org. Aggregating respect unfortunately goes a very long way.

Any tips or lessons learned on working with the non-technical folks? This is a struggle I am dealing with and am constantly trying to improve in. They want to do things their way, which might work okay but is inefficient and not in line with the technology goals of the company. Hard to wrangle them - they run off and do things without talking to me or the people in my department, not considering the plans technology has. I've been a CTO in the past and though I am not in that role now, we don't have a CTO and I am best suited so trying my best to fill in...
Unfortunately what has worked best in practice for me is:

1) Curate your resume and experience for years so that people will take your opinion very seriously (whether you deserve it or not)

2) When you know something is going to fail, call it out in advance with stakeholders and do whatever you can to pump the breaks and/or change course. If you have a lot of respect, you can use this to force an uncomfortable decision that someone without much respect might not have been able to push through.

3) Be VERY insistent in pushing your proposed mitigations when you know something is going to fail and know what will fix it. If you're sure, stake your career on it.

4) When people don't listen, and things fail because they didn't listen, in yearly review / feedback type things say "if only I had pushed harder for X, then Y might have been prevented" which is a nice way of saying "should have listened to me". Eventually everyone will just listen to you in the first place.

5) If you see the writing on the wall and no one is listening to you, exit while conditions are still favorable (I never actually do this, but I probably should).

6) When you are wrong, take responsibility, but only for the parts that are actually your fault. In reality the surface area of any one person's portion of blame in most situations is quite small anyway. Most decisions in orgs can be traced back to at least 4 people.

7) Make accurate predictions of failure if we don't take X course. When these come to fruition, you called it, when they don't, you still come off as very prepared for anything.

> They want to do things their way... Hard to wrangle them

This can happen when the software group is seen as incapable, unresponsive, or even just slower than "business speed". I'd suggest talking to the individuals and their leadership (separately) to learn more about why they adopted X without talking to your department. You may well uncover missing or broken lines of communication, entrenched negative expectations ("it takes a month to get a simple DB query run, why would anything else be faster?"), and/or find processes so onerous that everyone tries to avoid them.

As a CEO you would do this.

At the department level. Split them by probing for rifts between departments. Prioritize one group's project over another. Use department lack progress as dirt on that side's leadership. Get leader replaced and bring friendly face. Now both sides are friendly and open to better policies.

As a manager pretending to be CTO let them do what they want or you will be seen as the problem. Look for power shifts between departments and ally with the correct side. If your company wanted a strong CTO they would have hired or promoted someone. If you want to be in a position to be a strong CTO make powerful friends or get promoted and gather experience and win some awards.

>I had one job where there was a lot of technical debt, but my manager did not respect me and my colleagues had what was basically a "learned helplessness" attitude. So I'd go around trying really hard to make things better, but everyone responded to me like I was just crazy or naive or didn't know what I was talking about.

Heh, the job I just left had a team like this.

I'd bring up ideas _for discussion_ all the time, at the very least to make my team members reconsider how we handle certain things. Even if my idea weren't the accepted one, we really had good reasons to improve our status quo. Yet just like what happened for you, when I'd call out some issue or situation the response from the team was that I misunderstood something or was crazy or etc. It gave me a lot of self-doubt, but I'd also bring up the issues to a senior engineer and he'd agree that usually my topics were worthy of at least some discussion since they had the potential to become improvements.

What would drive me crazy is pointing out code that _clearly_ did not do what it was supposed to do and get back, at best, a shrug. I think I'm pretty open minded on most tech topics -- I started with PHP! If the code works I'm happy, everything else is gravy! -- but to have people insist that, no, this is fine and, yup, being on-call with services guaranteed to wake you up at 2AM at least once during your rotation and our stakeholders sending nasty grams once a month is just normal... crazy making.
> I left. My new job has lots of tech debt, lots of processes that are broken, but when I propose changes people listen

I'm in a non IT position right now and everybody is so stuck in the swamp everything is a 'no'. It now devolved into neverending politics. Mail fights and delays. A weird kind of bore and burn out.

I blame the terrible education system and software hiring practices. Graduating students don't know how to build software in a team, businesses do not properly onboard, and hiring practices are like an exam that has nothing to do with the work being done. Companies are becoming more averse to hiring those that actually learned software and didn't just fluff their resume with degrees and bootcamps because less engineers are doing the hiring.

Those that didn't have to work for it sit back and enjoy the paycheck while getting by with the minimum amount of work. To everyone involved work can just be a free payday, if the product fails they'll move elsewhere. Or if the product is too big to fail it's guaranteed anyways. Actual engineers are a rarity, and these companies don't like them because they point out how management has been milking the project.

I would recommend reconnecting with the fun of being a developer.

Make something purely for yourself, just because you want it for yourself (whether an app or a website or a desktop program, a game, etc).

Design and code it how you want, focusing on making it work without obsessing about doing it the right way.

I think that will help you recapture the pure joy of coding.

Once you have recaptured that, then I think a lot of other stuff will kind of get back into the right perspective.

I do miss hacking away at stuff just for the joy of it. I'm a little OCD so I have to be mindful about not attempting perfection as I go.

Maybe I need to mess around with some personal projects.

Do Advent of Code. It's the first time I've been drawn into extracurricular programming in quite some time. It's been fun. They're bite sized problems and you're only committed as far as you want to be, and no later than Christmas.
I recommend you build a Java-based logging utility that is secure.
(comment deleted)
This seems like less of a development problem and more of a self confidence problem. You should have a session with a therapist, there is probably a deeper cause of this in your life and you'd be better off trying to figure out that than finding a bandaid that HN could provide.

There are tons of remote options like BetterHelp where you can get an appointment quick without much hassle or commitment, so it's a pretty low threshold to give it a shot---that might be a good place to start. Good luck!

Besides therapist, a 'personal development coach' could also work.
Its so hard to untangle everything that might be going on here(based on 3-4 sentences), but at the end of the day if you know you are a decent developer and you have been able to hold down a CTO role for this long, you are worthy of confidence in yourself. Not every decision you make will be a good one(and that is absolutely ok, if people working with you can't understand that, it is on them), but one of the worst things you can do is to stop making impactful decisions out of fear that some of them will not have great outcomes.

If you have a mentor or someone close that you really trust, I would really sit down with them and talk through this. Slumps are expected, and everyone has different ways to get out of them!

Also, this doesn't sound like burn out, but I could definitely be wrong.

As CTO, you probably don't have the time and space, structurally, to be a good developer. You have things to do that aren't a single project or feature! So of course other developers will be better at "being a developer" than you, by some measures.

I've seen two successful models of CTO that are "good developers:"

1. Knows the core tech of the company really well. There's some small bit of tech at your company that's legit an enabler of your growth. You should probably know it better than anybody. Maybe it's moved or changed or grown in the last 8 years, and you've lost touch a bit? It seems reasonable to carve out time to build something on your own, in the same space, using the new stuff. You probably have a better sense of what's important to get right than anybody else, so building a personal project with that tech on company time _is_ actually a great use of time.

2. Knows the system dependencies better than anybody else. This particularly applies if you have reliability woes or other systematic issues. You have a great position to ask other teams to educate you. Get a couple good devs from each team in a room, drop your ego, and have them teach you what they know in their domain. Do this across a bunch of teams. Some folks might find this irritating, but most folks will like the time to show off their work and share their worries.

Everybody is constrained by where they spend their time. If you want to go back to being a great IC ... you need a different job. Which it might be time for! But you can be technically great as a CTO, and I'm sure I've missed some other ways you can do it in the context of you "day job."

not having blind faith in yourself is a really good thing because it makes you humble and willing to learn. Shitty work isn’t the end of the story because you can improve it over time. Doubting your decisions helps you avoid fooling yourself.

How do you escape the funk? Realize the funk is useful and normal, and it always was!

Serious answer: drugs, specifically psychedelics like Psilocybin. There is a reason use of these medicines is often called "tripping" - it will take you to a new place and offer you new perspectives.

None of the comments here will give you the faith in yourself that you seek (that is not to say they are not good, or not beneficial). You are the only person who can give you that.

I've been super interested in trying Psilocybin as an long term anti-depressant. Looking forward to more research coming out on this topic.
It's a fungus that literally grows on cow shit - what have you got to lose? Humanity have been using this for thousands of years. Nothing to be afraid of! (tl;dr You don't need to wait for the right research to appear on your doorstep in order to give it a shot)

I utilize both micro and macro dosing and would recommend it wholeheartedly to anyone. If you or your family have had histories of serious psychotic disorders, bipolar, schizophrenia, etc... it can potentiate that - tread carefully - but otherwise I give the thumbs up.

"I've lost faith in myself as a developer, how do I get it back?"

Me too. I don't know. Force yourself into situations where it's sink or swim and that nobody is willing to step up to?

I don't since I have a family to support. If you're a CTO, that sounds like you've already made it.

- maybe do a fun, small coding side project

- possibly your thoughts and feelings might be hormone-related. If male, consider getting T checked?

- optimistically, maybe you have built such a strong team that you doubt yourself in their context and it's time to move on :)

Ask your teammates. Communicate. The role of the CTO grows at the stage were you are immensly but the hardest switch you have to make is to manage people and not projects. Because, you know you hired people for the projects.

Its OK to not know something, CTO's and principal engineers are not gods of their trade but people who use the synergies presented to them. That is not an archive of man pages that you have produced for your minions, but the combined effort of everyone (technical) involved.

Realizing that you may lack a certain set of information is a perfect point to reach out to someone in your team, who does. You will see that the exact opposite of what you are expecting will happen: people will you value more because you can be reasoned with. See it this way: even if you could theoretically barely program, I wold wager that you have more tech skills than some CTOs the past has brought up. Really successfull ones too.

Even if noone other in your team has the answers to your problem, the solution is still communication. Either hire talent or use freelancers and consultants. That is what we do. But the result its still the same, it's your team that is facing the problem, not the problem facing the team.

On the risk of sounding a bit funny, but maybe you should consider taking a management course?

professionally executed K E T A M I N therapy.
> When I look at a new feature I just think that I will make it shitty or get called out on not doing things the "right" way.

Why are you implementing features as a CTO? Isn't that what your team is for?

You need to find other smart people in a similar place but with no skin in your game and rubber duck with them about what you're thinking about.

This has a lot of benefits: you can serve as their rubber duck and help solve their problems which feels great.

You can sanity check your thought process and conclusions. This will help assuage the doubt.

And it's a social connection which helps with anxiety.

Also, go easy on yourself. No one knows the 'right' answer. It's great to look for the best move but it's ok to make a bunch of merely really good moves, too. Allow yourself to accept the context under which your decisions are made.

Don't forget to give yourself space. You're CTO. Delegate the shit out of everything you can, even the stuff you're best at. Call it a growth opportunity for your team. But if you don't give yourself the space to make great decisions, everyone suffers. Avoid the 'busy-ness' trap at all costs. That's not your job.

Yeah, I've been in a similar situation. One ugly side about being a developer I find is that if I stay away from the practice of coding for even like 3 or 4 months I feel rusty or I feel like you've missed out on a lot. I remember when I took off 4 months and then started doubting my moves.

The time I took off was restful, for sure, but the insecurity I felt was extreme. It took me another 3 months to get my groove back and just feel like, "no, you know what? I'm a decent programmer and I have earned the right to be here with the other devs. I'll catch up in my knowledge gap."

I always wondered how female programmers who go on mat leave cope with stepping away from it all for like a year.

I actually think that self-doubt is a sign that you're growing as a developer. If you had asked me how hard it would have been to write an OS kernel ten years ago, I probably would have said something like "Oh yeah, that's pretty hard, it would probably take me like four months to make Linux."

If you asked me to reinvent the Linux kernel now, I would probably first say "I don't know anything about that, I'm not your guy", and if you were really insistent I'd give a huge number, like 10-15 years, with several disclaimers of "seriously, I don't know what I'm doing here, I'm pulling these numbers out of my ass".

Did I become a worse engineer in the last decade? No, I was just inexperienced ten years ago, and as a result I wasn't really able to differentiate "easy" and "hard" problems, and since I was a goofball (with too big of an ego at the time) I just assumed most projects were easy. Nowadays I have a much better handle on what I know and what I don't know, and as a result I find myself in doubt about things all the time. It's easy to get into a spiral of "I don't know to do this and omg I'm going to fuck it all up."

A single-core single-tasking (or co-operative multitasking) OS kernel is fairly easy. You just need a memory allocator, syscalls, maybe some virtual memory or process isolation (as a treat), and a basic display driver.

Writing the USB stack would probably take longer than the whole rest of the OS combined. (Though you'd be hard-pressed to write a USB stack in less than four months.)

That might be true (I don't know, I've never done it), but my point is that I would have thought that I could implement something as large as Linux or macOS in a few months, when in reality that's certainly not true even with my ~decade of experience, let alone when I first dropped out of college in 2012.
There's no reason you shouldn't have been able to. Programming basic things like an operating system shouldn't be as hard as it is. (Honestly, programming an entire OS is easier than programming within existing systems, at this point, for many applications – but only if you can cope with bare-bones serial I/O.)
You're completely missing his point. He was simply using "programming operating systems" as an example. His point still stands regardless of how easy you think something is or should be.
If your goal is to produce Linux, you've picked the wrong goal; just use Linux! But back when computers were simpler, in the months April – August 1991, one absolutely could make an OS kernel where things “seem to work” in four months.
Ok, you're very clever. Replace "building an OS" with "proving the Goldbach hypothesis" or something. I was just giving an example of what I thought was a challenging project. Clearly for you it wouldn't be challenging.
I've been thinking about how in much of software engineering there is no "right" way to do anything. The only "wrong" decisions are those made without adequately considering all the tradeoffs or made without much thought at all. I would say your role as CTO is not to know everything and make unambiguously "correct" decisions all the time. It's to make sure the right questions are being asked and considered when technical decisions are made.
I had a CTO in your same situation. His remedy was to schedule more meetings.