NATURE

As a software engineer aiming to commit to the profession for a lifetime, it is crucial to develop a strong foundation that transcends specific tools, languages, or trends. The following principles capture the essence of what truly matters in software engineering at a fundamental level.

Problem Solving Ability

Description

Key Competencies:

  • Defining problems clearly in ambiguous environments
  • Decomposing complex systems into manageable parts
  • Applying algorithmic thinking to practical scenarios
  • Recognizing trade-offs (e.g., time vs. space, simplicity vs. completeness)

References:

Abstraction and Design Thinking

Description:

  • Abstraction allows engineers to manage complexity. Design thinking ensures that what we build aligns with human needs and business context. Together, they enable scalable and maintainable systems.

Key Competencies:

  • Understanding and applying abstraction layers (e.g., domain modeling, API design)
  • Designing systems with separation of concerns
  • Making architecture decisions based on context (YAGNI, KISS, SOLID)
  • Applying DESAIGNPATTERN to capture recurring design solutions and improve communication
  • Understanding the why behind each pattern, not just the how
  • Using patterns to improve cohesion, reduce coupling, and manage complexity

References:

  • Fred Brooks, The Mythical Man-Month (1975)
  • Eric Evans, Domain-Driven Design (2003)
  • Christopher Alexander, A Pattern Language (1977)
  • David Parnas, On the Criteria To Be Used in Decomposing Systems into Modules (1972)
  • Barbara Liskov & Jeannette Wing, A Behavioral Notion of Subtyping (1994)
  • Edsger W. Dijkstra, The Humble Programmer (1972)
  • John Ousterhout, A Philosophy of Software Design (2018)

Core Computer Science Knowledge

Description:

  • While tools evolve, core CS concepts remain central to software engineering. They help in debugging, optimization, and understanding the underlying behavior of systems.

Must-Know Topics:

References:

  • Andrew S. Tanenbaum, Modern Operating Systems
  • Thomas H. Cormen et al., Introduction to Algorithms (CLRS)
  • Leslie Lamport, Time, Clocks, and the Ordering of Events in a Distributed System (1978)

Communication Skills

Description:

  • Engineering is a team sport. Communication is key not only to collaborate, but to influence, lead, and document ideas clearly.

Key Competencies:

  • Writing clear documentation and proposals
  • Explaining technical concepts to non-technical stakeholders
  • Receiving and giving constructive feedback (e.g., code reviews)
  • Facilitating meetings, aligning on priorities

References:

  • William Zinsser, On Writing Well
  • Patrick Winston, How to Speak (MIT OpenCourseWare)

Learning How to Learn

Description:

  • Technology moves fast. The best engineers are those who learn continuously and adapt quickly.

Strategies:

  • Meta-cognition: understanding how you learn best
  • Setting up feedback loops (e.g., deliberate practice)
  • Maintaining a growth mindset
  • Curating trusted sources (books, blogs, mentors)

References:

  • Barbara Oakley, Learning How to Learn (MOOC / Book)
  • Cal Newport, Deep Work (2016)
  • Carol Dweck, Mindset (2006)

Ethics and Responsibility

Description:

  • As engineers, our work affects millions. We must consider the ethical consequences of what we build.

Considerations:

  • Data privacy and security
  • Algorithmic bias and fairness
  • Responsible use of AI and automation
  • Designing for failure and user safety

References:

  • Cathy O'Neil, Weapons of Math Destruction (2016)
  • ACM Code of Ethics
  • IEEE Code of Ethics

Systems Thinking

Description:

  • Beyond writing functions, engineers must understand how components interact within complex systems. This includes both technical and social systems.

Key Competencies:

  • Understanding emergent behavior
  • Identifying bottlenecks, feedback loops, and failure modes
  • Holistic thinking across boundaries (Dev, Ops, Biz)
  • Applying observability and resilience patterns

References:

  • Donella Meadows, Thinking in Systems (2008)
  • Google SRE Book: Site Reliability Engineering (2016)

References

  • David Parnas, On the Criteria To Be Used in Decomposing Systems into Modules (1972)
  • Fred Brooks, No Silver Bullet: Essence and Accidents of Software Engineering (1986)
  • Edsger W. Dijkstra, The Humble Programmer (1972)
  • Barbara Liskov & Jeannette Wing, A Behavioral Notion of Subtyping (1994)
  • Donella Meadows, Leverage Points: Places to Intervene in a System (1999)
  • John Ousterhout, A Philosophy of Software Design (2018)
  • Peter Senge, The Fifth Discipline: The Art and Practice of the Learning Organization (1990)