True seniority as a software engineer isn't just about technical prowess, but also navigating the complexities of existing systems. Working on a legacy project forces you to confront imperfect code, undocumented features, and the constraints of outdated technologies. This experience cultivates essential skills like debugging intricate problems, understanding system-wide implications of changes, making pragmatic decisions amidst technical debt, and collaborating with others who've inherited the system. These challenges, while frustrating, ultimately build a deeper understanding of software development's lifecycle and hone the judgment necessary for making informed, impactful contributions to any project, new or old. This experience is invaluable in shaping a well-rounded and truly senior engineer.
After a decade in software development, the author reflects on evolving perspectives. Initially valuing DRY (Don't Repeat Yourself) principles above all, they now prioritize readability and understand that some duplication is acceptable. Early career enthusiasm for TDD (Test-Driven Development) has mellowed into a more pragmatic approach, recognizing its value but not treating it as dogma. Similarly, the author's strict adherence to OOP (Object-Oriented Programming) has given way to a more flexible style, embracing functional programming concepts when appropriate. Overall, the author advocates for a balanced, context-driven approach to software development, prioritizing practical solutions over rigid adherence to any single paradigm.
Commenters on Hacker News largely agreed with the author's points about the importance of shipping software frequently, embracing simplicity, and focusing on the user experience. Several highlighted the shift away from premature optimization and the growing appreciation for "boring" technologies that prioritize stability and maintainability. Some discussed the author's view on testing, with some suggesting that the appropriate level of testing depends on the specific project and context. Others shared their own experiences and evolving perspectives on similar topics, echoing the author's sentiment about the continuous learning process in software development. A few commenters pointed out the timeless nature of some of the author's original beliefs, like the value of automated testing and continuous integration, suggesting that these practices remain relevant and beneficial even a decade later.
Ron Garrett reflects on six failed startup attempts, rejecting the label of "failure" and instead focusing on the valuable lessons learned. He emphasizes the importance of choosing the right co-founder, validating ideas early and often, building a minimum viable product (MVP) quickly, and iterating based on user feedback. Marketing and distribution proved crucial, and while passion is essential, it must be coupled with a realistic market and sustainable business model. Ultimately, he learned that "failing fast" and adapting are key to entrepreneurial growth, viewing each setback as a stepping stone toward future success.
HN commenters largely praised the author's vulnerability and honesty in sharing their startup failures. Several highlighted the importance of recognizing sunk cost fallacy and knowing when to pivot or quit. Some questioned the framing of the experiences as "failures," arguing that valuable lessons and growth emerged from them. A few commenters shared their own similar experiences, emphasizing the emotional toll of startup struggles. Others offered practical advice, such as validating ideas early and prioritizing distribution. The prevailing sentiment was one of empathy and encouragement, acknowledging the difficulty of entrepreneurship and the courage it takes to try repeatedly.
Summary of Comments ( 209 )
https://news.ycombinator.com/item?id=43047341
Hacker News users largely disagreed with the premise of the linked article. Several commenters argued that working on legacy code doesn't inherently make someone a senior engineer, pointing out that many junior developers are often assigned to maintain older projects. Instead, they suggested that seniority comes from a broader range of experience, including designing and building new systems, mentoring junior developers, and understanding the business context of their work. Some argued that the article conflated "seniority" with "experience" or "tenure." A few commenters did agree that legacy code experience is valuable, but emphasized it as just one aspect of becoming a senior engineer, not the defining factor. Several highlighted the important skills gained from grappling with legacy systems, such as debugging, refactoring, and understanding complex codebases.
The Hacker News post "You're not a senior engineer until you've worked on a legacy project" generated a fair amount of discussion, with many commenters sharing their perspectives on the value of legacy project experience for senior engineers.
Several commenters agreed with the premise, arguing that grappling with legacy codebases forces engineers to develop crucial skills like debugging, understanding complex systems, and making careful, incremental changes. One commenter highlighted the importance of learning to work within constraints and understanding the trade-offs made in the original design. Another pointed out the value of legacy projects in teaching patience and the importance of documentation. Someone else emphasized the realization that perfect code doesn't exist and the need to appreciate the effort of previous developers. The experience of working on a legacy system, they argued, instills a greater sense of responsibility and helps engineers avoid repeating past mistakes.
However, some commenters disagreed with the article's strong assertion. They argued that while maintaining legacy code is a valuable skill, it shouldn't be a requirement for senior engineer status. One commenter suggested that greenfield projects can be just as challenging and require a different set of skills, like architectural design and foresight. Another commenter pointed out that some senior engineers specialize in specific areas that might not involve interacting with legacy code. They argued that equating seniority with legacy experience is an oversimplification.
A few commenters took a middle ground, acknowledging the benefits of legacy project experience while cautioning against overexposure. One argued that too much time spent on legacy systems can hinder professional growth and prevent engineers from learning newer technologies. Another commenter emphasized the importance of finding a balance between maintaining existing systems and contributing to new projects. They suggested that rotating engineers between legacy and greenfield projects can provide a well-rounded experience.
Beyond the central debate, some commenters shared anecdotes about their own experiences with legacy code, highlighting both the frustrations and the learning opportunities. One commenter shared a story about inheriting a complex system with no documentation, while another talked about the satisfaction of successfully modernizing a legacy application. These anecdotes added a personal touch to the discussion and illustrated the diverse challenges and rewards of working with legacy projects.
Finally, there was some discussion about the definition of "legacy code." Some commenters defined it simply as "old code," while others emphasized the lack of tests, documentation, or original developers as key characteristics. This nuance highlighted the complexity of the topic and the varying perspectives on what constitutes a legacy system.