25 ms·
Ask HN: What does mastery look like in software engineering?
When you think of someone who has mastered the discipline of Software Engineering what comes to your mind?
- tsjq 6y agoPerfect estimates, deep insights, and anticipating challenges
- mytailorisrich 6y agoI would say that even just aiming at perfect estimates is a sign that mastery has not been achieved yet. Wisdom is to acknowledge uncertainty and that estimates are uncertain in nature because the information available at the time is always incomplete.
- orisho 6y agoThat's only if the challenge is completely new. Sure, if you're researching something novel in an area you've not worked on, the information you have is likely very far from complete. But if you're writing a backend server for a new POC for the umpteenth time in your career, you're likely to be able to do it fast, well, and be able to estimate how long it's gonna take. The reason being that the unknowns are slim to none.
- ironmagma 6y agoYes, but there are also situations that demand certainty and accuracy in estimates. One must appease them by looking as though you are trying.
- kmclean 6y agoI like Mozilla's descriptions of increasingly senior roles. https://twitter.com/Gankra_/status/1046438955439271936/photo/1 https://twitter.com/Gankra_/status/1046438955439271936/photo...
- jugjug 6y agoI think of Rich Hickey [1]: helping others to understand the code faster by identifying and removing most of the accidental complexity. [1] https://www.infoq.com/presentations/Simple-Made-Easy/ https://www.infoq.com/presentations/Simple-Made-Easy/
- abdabab 6y agoThis reminds me of a talk of Linus Torvalds. From this perspective, mastery can be seen as an acquired taste that came after doing a large volume of work.
- rramadass 6y agoCan you please link the talk?
- abdabab 6y agoIt’s this one: https://www.ted.com/talks/linus_torvalds_the_mind_behind_linux/up-next https://www.ted.com/talks/linus_torvalds_the_mind_behind_lin.... The code he referred is here: https://github.com/mkirchner/linked-list-good-taste https://github.com/mkirchner/linked-list-good-taste
- rramadass 6y agoAh; i had seen the TED talk earlier though i had not looked at the code example in detail. Thanks for the links.
- thedevindevops 6y agoPai Mei mustache, sits on a rock meditating and dispensing advice to juniors, quotes Martin Fowler by heart, seems to never touch a keyboard but every commit will replace entire module(s) flawlessly, demonstrating high level architectural knowledge that lies on the far side of the organisation's learning curve.
- dave_sid 6y agoHahahahaha. This is the funniest thing I’ve read on HN.
- whatshisface 6y ago>but every commit will replace entire module(s) flawlessly That's big commits, you're not supposed to do that. Masters commit individual characters that replace entire modules flawlessly.
- tachyonbeam 6y agoEvery module Pai Mei implements fits on a single page of his 80-column terminal, including comments. He manages this brevity not with obscure one-liners, but through algorithmic simplicity. Every module is precisely as complex as it needs to be to accomplish its purpose, no more, no less.
- barbarbar 6y agoPai Mei never deletes or modifies a single character. Every keystroke is perfect and can only be as it was initially.
- voxic11 6y agoHe never said the commit will be big. He just said the commit will "replace entire module(s) flawlessly" which you seem to acknowledge can be sometimes done with as little as a single character.
- jgwil2 6y agoHe squashes commits on merge.
- AnimalMuppet 6y agoHandling errors rather than ignoring them. Knowing that the correct answer to almost every question is "it depends". Knowing how to somewhat-less-inefficiently produce larger-scale software that adequately meets the need. (Note that I did not say "efficiently", and I did not say "bug-free".) This takes at least some skill in dealing with people, not just computers.
- Sevii 6y agoI'm somewhat doubtful that 'mastering' Software Engineering is possible. You wouldn't ask what it looks like to master the practice of medicine today because there are dozens or hundreds of specialities and roles all of which contribute to medicine. Firmware engineering and 'agile' website development are very different practices with different assumptions, requirements, etc. I wouldn't expect someone to master both web development and video encoder development just like I wouldn't expect a doctor to be a master pancreatic surgeon and develop vaccines. On the other hand there is a 'journeyman' level of software development and engineering skill that carries over between different development areas. It's definitely not algorithmic interviews though.
- silicon2401 6y ago> You wouldn't ask what it looks like to master the practice of medicine today because there are dozens or hundreds of specialities and roles all of which contribute to medicine. This is like saying you can't have a favorite type of rectangle because some rectangles are squares. If you're a master of neurosurgery, a reasonable person would also consider that to be a master of medicine. Just as I would expect a master neurosurgeon to not be a master dermatologist but be able to master dermatology much faster than I could as a non-medical person, I would similarly expect a master C++ developer to master Javascript frontend development much faster than a junior dev, let alone a non-software person.
- throwaway889900 6y agoFabrice Bellard, the mind behind FFMpeg and QEMU.
- permille42 6y agoHe is one of 3 people that came to mind immediately reading this post. One of his latest creations, QuickJS, is quite remarkable. The other two I thought of are Peter Norton and Linus Torvalds. Fabrice, despite his tremendous contributions to the field, doesn't reach for acclaim and just seems to go his own way. Peter Norton was a genius in his field. His book on Assembly Language was one of my favorites as a youth. Norton tools were impressive for their time. Linus, as the namesake for Linux also made a huge impact on the field... and comes off as somewhat of an uncontrolled lunatic. I don't though think that these three people are the highest level masters in the field. I think they are just the ones who have chosen to do things that have high impact and visibility.
- mandeepj 6y ago>Linus, as the namesake for Linux also made a huge impact on the field... and comes off as somewhat of an uncontrolled lunatic. Ha! Would you consider Musk also as a Lunatic? :-)
- permille42 6y agoMusk isn't great enough to deserve such a high title of lunatic. More like arrogant madman.
- Izkata 6y agoPerhaps a Marsatic ;D
- rramadass 6y ago>Linus, as the namesake for Linux also made a huge impact on the field... and comes off as somewhat of an uncontrolled lunatic. What? Linus is one of the most Rational, Direct, No-Nonsense, Get Things Done Leader there is. Whenever i hear some self-appointed "expert" pontificate on Leadership/Management/etc. i always think of what Linus would say/do in that situation. People only think of him as a "Technical Guy" but his Leadership/Management of something so vital, so huge, so distributed, with so many "employees" and with so few resources, so many stakeholders is what is amazing to me. Nobody comes close. You really need to take back the "uncontrolled lunatic" phrase.
- jasonpeacock 6y agoConsistently and reliably delivering good software solutions. Just like a master woodworker would consistently and reliably deliver good furniture. Or a master author would consistently and reliably deliver good books. The key points are: * Consistent - It wasn't just a fluke or luck, you know what you're doing and can repeat it. * Reliable - You know how much effort it will take and can deliver it. * Good - It's not crap, people want it.
- l0b0 6y agoSome acceptance tests for a software engineer: - Should know many tools to the level where they know their strengths and weaknesses. This allows them to select a useful collection of them for any new piece of work. - Should produce incremental project changes which all either improve the value or reduce the cost. - Should balance all the improvements to produce useful, working software with a reasonable cost. For example, producing super-secure software with no useful features, featureful software with a bajillion bugs, or bug-free software with a gigantic cost are all bad.
- dumbfoundded 6y agoIMO it's about understanding the solution curve in the problem space. Every problem type has a range of possible solutions. Most of these solutions are wrong and a few are correct with different tradeoffs. When you can't do better without making tradeoffs, you're on the curve. Novice engineers will struggle to get something done. Intermediate engineers can get things done but fail to see the tradeoffs. Expert engineers can identify possible solutions with different approaches.
- throwii 6y agoHow do you learn that solution curve and their tradeoffs? Swap jobs and hope you see them all in your lifetime? Read articles and hope you pick everything up correctly?
- dylkil 6y agoraw experience
- morphicpro 6y agoHaving a good grasp on time vs space complexity helps.
- mandeepj 6y agospace is cheaper
- dumbfoundded 6y agoI'd recommend: - Working with experts - Writing and deleting lots of code - Participating in code reviews - Reading even more code from others - Watch & read technical presentations You can never truly be perfect, you can only approach it. Understanding your limitations is just as important as understanding your capabilities. Depth vs breadth is hard and you only have so much life to go so deep into so many domains.
- cbetti 6y ago
- codingdave 6y agoI don't think there is mastery in this work. I've been doing this for decades, and I still think my code from 6 months ago is crap, no matter how much I learn and improve. Mastery would imply that you can do it all, and do it right, on any project, and there is just too much change and evolution for that to ever be true. My goal is simply that I continue to improve.
- dumbfoundded 6y agoThat's the right mindset for an individual but not particularly helpful for an answer. Constant improvement is part of mastery but not a great yard stick. I also have trouble believing you've been coding for so long and can't take pride in any of the code you've previously written.
- ChrisMarshallNY 6y agoI'm proud of my very first shipped engineering project: https://littlegreenviper.com/TF30194/TF30194-Manual-1987.pdf https://littlegreenviper.com/TF30194/TF30194-Manual-1987.pdf (Downloads a PDF). I think I do what I do pretty well. The folks I work with seem to like it.
- karlmcguire 6y agoI think most "master" software engineers are a bit more idealistic than that... Not saying I am a master but I occasionally write something and consider it genuinely beautiful.
- unsatchmo 6y agoLength of time doing something doesn't imply mastery. It can contribute to mastery, but only if you're always pushing your skill to the next level I think. For example: I know people who have been skateboarding for decades and are just barely OK at it. How you practice matters.
- Lammy 6y ago> I don't think there is mastery in this work. I think there is mastery, but only in knowing that there is no mastery. "I seem, then, in just this little thing to be wiser than this man at any rate, that what I do not know I do not think I know either." [Apology of Socrates, Henry Cary literal translation]
- blackrock 6y agoTwo words: Functional Programming
- millstone 6y agoFunctional programming is taught in schools, so engineers straight out of college know it. I was one of them!
- rusk 6y agoHighly competent in at least 3 languages; general understanding of 5 others; good written communication and presentation skills; able to create gui; understanding of distributed systems and networking; unix command line; can at least rebase in git
- mlthoughts2018 6y agoWhy on earth would number of languages have anything to do with it. That doesn’t make sense. Parochial number of languages doesn’t capture the idea of understanding multiple paradigms, low level / high level, type system considerations. A person might have zero experience except Node.js yet still show high mastery of functional programming, mixed OOP, design patterns, compilers, etc. Setting any threshold on languages just sets up a meaningless metric.
- rusk 6y agoIt’s just a simple and objective yet general measure of mastery If you have these skills there is a very high likelihood that you can do most other things that are thrown at you Most of the other answers have all these high level wishy washy specifications, I thought I’d take a more brass tacks approach.
- CyberDildonics 6y agoIt is mostly beginners and students that think learning programming languages is difficult or is a big part of the difficulty of writing software.
- rusk 6y agoWell I’m neither of these so ... I suppose this list could be called necessary but not sufficient. The question is what does a master “look like”. If you can only work with one or two languages you are by no means a master.
- corytheboyd 6y agoJust rattling off some thoughts of my own * Consistent delivery of quality work * Instead of complaining about bad requirements that threaten system integrity, happily works with stakeholders to compromise on them accordingly * Can consistently describe every detail of every bit of work they have done, and answer any curveball questions about it too * Succinct and to the point, doesn’t bog down meetings with tangential arguments and what-aboutisms Could probably keep going but that’s good for now haha. I know I don’t even satisfy all of these points myself at all times, but I certainly try to!
- permille42 6y ago"Who is John Galt?" Mastery could most closely be viewed as a state of enlightenment. To the non-enlightened it will appear to be dismissive and lazy. There are a variety of positions one could take once reaching enlightenment: 1. Domination. One could choose to be controlling of the entire field and use it for selfish benefit. 2. Dismissive. Once you reach the pinnacle it becomes apparent that both humanity and the society it has created are horrid and aren't worth interacting with. 3. Appreciation. One could choose to be thankful for being able to reach such a position and to respond by generously using the mastery to use it for the good of humanity. 4. Constructive Legacy. One could choose to form ones own group around that mastery to preserve it beyond themselves. I believe the dismissive position is the most reasonable and hence most likely to be chosen by those who reach true mastery. All four positions regularly occur and you can see it readily in masters of respective fields. The way a master appears depends on their reaction to having gained mastery. I think the dismissive position is also most likely because I believe there are far more masters than we ever notice. They are not noticed because the majority of them don't bother to use their mastery in an obvious way. Why should a master bother to correct those beneath them? If a master interacts with society they have an uphill battle to being treated with the respect they deserve. For the true master there is great value in going their own way and rejecting society.
- thelastinuit 6y agoIt reminds me of the Way of Tao
- one2know 6y agoQue all the managers that will immediately list off 5 manager activities as software engineering "mastery."
- smoyer 6y agoThat's an interesting question and I'm going to give you a somewhat snarky but truthful answer: Software mastery is exhibited by the code that I wrote today - and oh how horrible it is to look at what I wrote six months ago. Through-out my career, which is now over four decades if you include the software I wrote as a teenager (before I got paid to do it), I've continuously found a better, more elegant (which can almost always be read simpler or clearer) way to tell the computer what to do. So my non-snarky view-point is that there's no such thing as mastery but rather that it's the proverbial journey. There is however a baseline at the other end ... if it's not functional and maintainable, there's a definite lack of mastery.
- albertgoeswoof 6y agoMore likely that you a) overrate the quality of the code you wrote today (recency bias) and/or b) have forgotten the context/constraints that you wrote the code 6 months ago under
- paxys 6y agoBeing able to break a complex project into granular bite-sized tasks.
- deleted 6y ago[deleted]
- keyle 6y agoExcellent question, but how does one measure the length of a string constantly being extended on moving sands?
- computerdork 6y agoThis is of course a matter of opinion, but for me, seems like there are three sides to this: 1) Knowledge of the core theories of computers: core ideas of computer architecture, good understanding of computational complexity (how long a program will take to run), networking... 2) Knowledge of software technologies: Python, Javascript, Java, C, Docker, Functional Programming, Object-Oriented Programming... 3) Knowledge of software engineering concepts: Software architecture, software process (agile, requirements gathering, testing), software complexity (and how to minimize it through good architecture and processes), general engineering principles (redundancy, fault-tolerance, solving problems early in the dev process...). To me at least, the one that is neglected the most is the third one, "software-engineering concepts." Being able to think about systems at a high-level and well at the detail-level is one the most useful skills for an engineer.
- lackbeard 6y agoExample masters: John Carmack, Jeff Dean, Bram Cohen. What do they do? I think they're all extremely effective at getting things done. So be smart, hard working, and laser focused on shipping. A long time ago I saw a good talk by Jonathan Blow wherein he made a point that really resonated with me. The point was that to get good at programming you need the experience of shipping a lot of programs and thus you should optimize your career around shipping as many good programs as you can. Contrast this with the common advice of being an expert in databases, or distributed systems, or OOP, or testing, or something like that... Edit: found the talk: https://www.youtube.com/watch?v=JjDsP5n2kSM https://www.youtube.com/watch?v=JjDsP5n2kSM
- collyw 6y agoTo play devils advocate. Perl 6 is an example of where not shipping was a major contributor to the decline of the language. Shame, as it looks interesting.
- lizmat 6y agoIf you think it looks interesting, you should have a look at Raku (https://raku.org https://raku.org using the #rakulang tag on social media). Looks familiar? It should be, as it is the new name of Perl 6. It now also comes with an IDE (https://commaide.com https://commaide.com) if you're so inclined :-)
- collyw 6y agoIs that just a rebrand? Wasn't Raku one of the implementations?
- varikin 6y agoI recently got a masters in software engineering, not that this means I've mastered the discipline, but I think it set a decent idea of what is important. Here's a incomplete list of topics that I is worthwhile: Creating a data schema (sql, no-sql, api based, whatever). This seems simple and obvious, but it becomes very hard very fast, especially when you need to model a complex subject that you know nothing about. Consider being hired by a hospital to model their records, or an insurance company. You need to talk to many people and understand how everything they say and do relates to everything else. Project management: You may not want to be a project manager, but you should familiar with scrum, agile, waterfall, lean, and kanban. At least you can have an informed opinion when you argue for or against how things are done. QA: You should know how to write a test plan for a large feature or application. This includes unit tests, manual testing, deciding what areas need more effort because getting it wrong is very bad and what is less important. This may include security and performance testing. Architecture and design: How would you design a new application? How would you add a new feature to an existing application? How do you communicate this design to a team or many teams? How to evaluate new things like languages, tools, libraries, technologies, etc. This isn't just reading a couple blogs, this is doing small scale test, proof of concepts, looking at the code to an extent, getting opinions for others you trust. Finally, communicating. Software engineering is a team sport. You need to know how to write design documents, test plans, maybe architecture plans, progress reports, etc. If you can't effectively communicate your designs, plans, or even why someone else's thing is bad or good, you won't be able to convince others that you are right. And remember, you need to not just convince your peers, but also non-technical people, such as managers, VPs, and many other.
- MaxBarraclough 6y agoYour point about databases strikes me as domain-specific. If you write high-performance game engines, or avionics software, or drivers, I imagine you could go your whole career without encountering a conventional database.
- varikin 6y ago> Creating a data schema (sql, no-sql, api based, whatever) Schemas apply to more than databases. That may be less important for drivers, where the developer is also the domain expert for what they are implementing, but not necessarily so for avionics software. Lets saw you are implementing a black box. Are you the developer also a flight expert that knows everything that needs to be recorded and how each data point relates to each other? Not just in the sense of the hardware, but everything an FAA investigator wants to know. Probably not. So you need to work with pilots, FAA, and other non-developers to understand that domain. Knowing how to construct a data model by talking to the experts of that domain is not just for databases.
- abeppu 6y agoWhen is "mastery" a meaningful concept for a field of endeavor? I think we wouldn't believe it makes sense to "master" physics or math, because the advanced work in those fields focuses on open problems. Even if one understands classical physics well, one cannot make specific predictions about medium-sized, low-ish energy systems like a double pendulum. Can anyone claim to be a "master" of an area in which there are such large known gaps in everyone's knowledge? Though in software engineering we have a lot of prior examples of successful and unsuccessful projects, we also have lots of open frontiers. And in some ways, it's much harder to "know" that an engineering approach or paradigm is "right" than it is to know that a theorem is true. How can we make types track the "important" invariances of a system? How can we convince ourselves that a distributed system can guarantee certain properties, or that a modification to that system doesn't break those guarantees? If I build a homomorphic encryption system as a service, how would I build debugging tools for it? Acknowledging the halting problem and its cousins, when can static analysis tools make useful, meaningful predictions about programs? In the bronze age, you could build an impressive stone tower. Sometimes you could even make it stay standing. But I don't think there were any master civil engineers.
- jgwil2 6y agoVery nice analogy to physics/math. I agree: the "best" people are always working on the next big problem.
- snarkypixel 6y agoIronically, it's often when there's no mastery that you realize what mastery is. (I.e. when things just work, are shipped on time and are easy to maintain, there's not much fanfare about it)
- 0xdeadbeefbabe 6y agoSomeone who is good at mental models.
- arensc 6y agoI agree with what you say
- girzel 6y agoHaving an accurate intuitive assessment of how difficult a task will be, and; knowing what to Google.
- deleted 6y ago[deleted]
- mikewarot 6y agoI heard a story that Dan Day - Rose Hulman class of 79, once sat down and typed in a complete system of programs and it worked the first time. Ward Christensen did it once as well, to the annoyance of my late friend Lloyd Smith, may he rest in peace.
- arensc 6y agoHey So I view Software Engineering as a multidimensional optimization surface where you have to optimize for a goal by choosing an axis and playing with those axis until you get a desired result. Mastering the language but understanding why the language was developed what problems it looked to address. Reducing the cognitive load of the design using the language. Understanding the fundamentals of the types of applications you will be building. SCRUD Architecture Apps Streaming Architecture Apps and Games which are usually a combination of both. Software Systems from first principles are read and write systems. How do you represent that as a program and reduce the complexity? How you view software engineering ? and explain it to others what is the method of representation you use to encode software as plumbing? is it text based? time flow graph node based? stack based ? binary based ? Software engineering as a team sport, how do you get a bunch of developers to reduce the cognitive load manage the relationships and data in the code and how do you measure that like a science. I am also sure there is a lot of valid advice here as well. This is how. I see it from a mathematical / science perspective that pushes pragmatic narrative.
- natenthe 6y agoIs this a parody?
- arensc 6y agoI realized something while explaining this, it might be intractable to explain other than to just use basic blanket statements lol
- natenthe 6y agoLOL. I think your GPT-3 needs some more training.
- ununoctium87 6y agoMaybe someone trying out a badly trained GPT-3 generator
- 6y ago
- breck 6y agoPay attention to who was the lead dev on the code you are using. When you see that you are using 2+ (sometimes 5+, rarely 10+) projects from the same person, then you've found a master. Start looking closely at what they are doing, what they are reading, what they are saying on their blog, twitter, etc. I think of Linus, Lars, Anders, TJ, Rich, etc
- agumonkey 6y agoI fail to decrypt who TJ can be
- SOLAR_FIELDS 6y agoTJ Holowaychuk, who has written some of the most popular Node.js libraries. Express.js is probably the one most have heard of. He now operates in the Go space in which I presume he also has some influence as well for OP to bother mentioning. I would say that his handiwork in crafting good libraries was a significant reason that Node took off like it did so quickly. This article from 2014 highlights just how many libraries he has written and how good he as at writing them: https://medium.com/@kelas/how-is-tj-holowaychuk-so-insanely-productive-604818b4e9eb https://medium.com/@kelas/how-is-tj-holowaychuk-so-insanely-...
- steve_adams_86 6y agoI don’t hear about his work often anymore, but I always appreciated his insights and how humble he was. Definitely seemed like the kind of person I’d like to work with and learn from. Though I suppose I did indirectly - I dug through his libraries for years out of curiosity and necessity.
- agumonkey 6y agoThis might explain the 'we repurposed npm to manage go deployment' articles I saw recently ..
- kelas 6y ago> article [by @kelas is all about] how good he as at writing them funny to see how this is still relevant. i'm sorry to say, but anyone who read this ancient piece at least marginally past tl;dr would know that your conclusion can't be more false (must be due to my poor command of your language, sorry about that.) i originally wrote this text in response to eponymous question on quora, which saw some unexpected gargantuan success with 100k+ views in the first year or something like that. tj said "meow" under that quora answer, and disappeared for good - while i was left exposed to some really agitated tech bloggers who wanted an interview about how did i get so smart to figure out that the entire headless chicken called node community was just brutally duped. no such interviews could be granted, but in wake of the story some people bothered to look for the clues in his gh activity - mostly frequency analysis of "his" commit logs in a galaxy of repos. this is why most tj's repos were promptly republished elsewhere after that. bottomline: the article says that tj was a SCAM, so there's that.
- bob1029 6y agoFor me, mastery is all about managing complexity. In my experience, most of the complexity in a software system emerges from excessive shared state between components and poor modeling of the domain. If you can break your problem up into smaller, independent pieces, you can pretty easily manage complexity throughout. By having a good domain model (which to me means context-agnostic and represented approximately in 3NF/BCNF), you automatically clear up most of the nasty interfacing between components. Also, having a domain model in a normalized form enables much easier querying for any required dimension of fact (i.e. SQL/LINQ/et. al.). The methods will almost automatically follow from a good domain model. Being able to develop good models of the domain and manage incremental complexity are the hallmarks of a master software engineer. You should note that neither of these fundamental skills requires the use of a computer.
- ipiz0618 6y agoIMO, it's knowing how to balance code quality and handle errors within time constraints and other restrictions. Any simple application has the potential to be very complex when one wants to handle every possible scenario. Knowing where to draw the line(s) would be what I consider mastery.
- rcaught 6y agoThe code you don't write is more important than the code you do write.
- 1vuio0pswjnm7 6y agohttps://en.wikipedia.org/wiki/DONKEY.BAS https://en.wikipedia.org/wiki/DONKEY.BAS
- deleted 6y ago[deleted]
- trestenhortz 6y agoIt’s fiction. No one is a master. There’s always stuff to learn. Competence is a better term. What it looks like is being able to make things happen quickly with minimal errors or problems. Unless you’re talking about the most extreme cases ..... Fabrice Bellard and John Carmack .... genius developers who are true masters. There are few of these.
- itsmejeff 6y agoI’ve been pondering this a lot lately, as an engineering leader. Masters in my organization have an extremely high ratio of value shipped to hours worked. This means two things. They are able to discern and avoid work that does not provide value (this is often their greatest skill), and the best ones can direct a whole team away from large swaths of work that is not valuable. And they are able to build systems such that the cost of adding more value to the system remains constant as the system grows in complexity.
- bribri 6y agoI agree with this. The best engineers choose the best targets
- taphangum 6y agoFantastic definition.
- yowlingcat 6y ago> the best ones can direct a whole team away from large swaths of work that is not valuable Can't overstate how valuable this is. A team which can expose its members to this kind of leadership by example and direct collaboration will grow and outproduce teams which don't by an order of magnitude.
- hiimtroymclure 6y ago> They are able to discern and avoid work that does not provide value (this is often their greatest skill) junior dev here...could elaborate a little on what this means? Generally speaking the PM is the one creating a roadmap and informing what is the highest value item to work on. I must be misunderstanding what you're referring too.
- aste-risk 6y agoThere are some teams that only work on high impact projects. If you feel that your current team is only doing work that's not valuable, you need to change teams or at least let your manager know to change your project. Ask for projects that you think will bring revenue to the company. Revenue = impact or increase in productivity of other engineers (this may involve writing an internal tool, etc.)
- LordHumungous 6y agoAbility to design and implement a large scale system from the ground up.
- tr1ll10nb1ll 6y agoGeorge Hotz lol
- davmar 6y agoI don't know, but I one practice along my journey has had a surprising impact upon my skill development. That one thing is: I started coding in VIM. For some reason, making that change has improved my thinking, and that's been a big part of my growth. So, maybe you'll find that to be a helpful practice as well. It's worth a try.
- bhattisatish 6y agoI don't want to sound over critical. It's not about the vim. Can you generalize it a bit more? Let me take a shot at it(!?) You introduced a new tool to your workflow. The consequences of that was - Lower productivity initially - You where forced to think about how you create/edit your code So, what made it work for you? - Thinking about how you structure and edit your code. This gave you some clarity around how to think and solve a given problem. Longer you practiced this, better you became at it. - Learning a new tool made you a better at certain things (Say how you manipulate large amount of text?). Better you became, more confidence you derived out of it. More confidence resulted in taking up more harder problems, and the cycle continues. - You have started thinking about your tools. You spent time and energy in learning it. This has broadened how you think about software development. This in turn has widened your ability to look at the software problems. I am not sure what I wrote resonates with you or not. But this is what I took away from you response "Making that change has improved my thinking" I feel, it's not the choice of the specific tool that made a difference, but the result of changing your regular habits that VIM bought about in your way of writing code. I am sure, a person who changed to emacs or Jetbrains also would have seen something change :-)
- davmar 6y agoGreat question and it's not overly critical. I'm afraid I can't give you a satisfying answer even though I would like to because even I'm not sure why VIM acted as a catalyst for me. What I think it did for me is two things: - the splits allows me to have multiple files (aka buffers) open at ones time and this might decrease the number of times I have costly context switches. - the vi way of manipulating text is faster and more efficient in terms of steps needed to complete an edit. I believe this reduces the cognitive load of mundane tasks and lets my mind stay focused on the actual problem I'm solving. VI may not help everyone obviously. But I think it opened a flood gate for me. Also the initial lower productivity wasn't really that bad so I don't think it had too much of an impact.
- chx 6y agoI have already made the mistake you are about to make.
- LeicaLatte 6y agoClearing a FANG interview. It does take months to prepare for even if you are a master.
- MarkMc 6y agoMastery in any field involves 4 components: Accumulation of knowledge, conceptual understanding, judgement and skill
- itisit 6y agohttps://www.bti360.com/what-ive-learned-in-45-years-in-the-software-industry/ https://www.bti360.com/what-ive-learned-in-45-years-in-the-s...
- known 6y agohttps://en.wikipedia.org/wiki/Code_refactoring https://en.wikipedia.org/wiki/Code_refactoring should do;
- tomaszs 6y agoSoftware engineering mastery occurs when a person brings donuts for everyone every single day.
- forgotmypw17 6y agostory of mel.
- still_grokking 6y agohttps://faculty.washington.edu/ajko/papers/Li2019WhatDistinguishesEngineers.pdf https://faculty.washington.edu/ajko/papers/Li2019WhatDisting...
- rramadass 6y agoExcellent, Great link and Thank You ! This answers the OP's question exactly; a proper empirical study on various dimensions of attributes. Everybody here should read this.
- mvanga 6y agohttps://bellard.org/ https://bellard.org/ Clean, well-documented projects showcasing demos that end up having huge impact. Some of these projects single-handedly spawned entire tech ecosystems. (see FFMPEG, QEMU, JSLinux)
- flixic 6y agoWas about to comment with the same URL. It's one "direction" of mastery. Software invention, at grand master level.
- ojciecczas 6y agoAmong other things a master splits the I/O code and core logic code.
- milchek 6y agoIs it possible? Maybe if you say a specific language, yes, but even then, there are new versions or iterations where whole new features are introduced. Mastery in software engineering needs to be defined very specifically. An example, I used to build Flash microsites, campaigns and games for an ad agency. I had a very good grasp of the tech, built projects for large clients etc. If you looked at me at that point in time you could say I had mastery, but now Flash is gone, and I didn’t switch over to React and other web based tech soon enough so my “skill” is lesser than someone who purely started in that domain.
- max_ 6y agoMy definition of a "Master" is someone that can churn out software that is both; - High performance (in terms of efficiency in using computational resources) - Reliable i.e does exactly what we want and doesn't crash. This also includes clear documentation. I think to reach there, some of the things one may want do are; a) Learn TLA+ b) Study hardware (processors, memory) c) Study software, protocols like tcp/ip d) Build experiments & ship
- e9 6y agoHow many times a year do they have to wake up in the middle of the night to fix something broken?
- Ayesh 6y ago- Sqlite - Symfony framework
- ignoramous 6y agoNot sure about software engineering, but if I have seen anyone absolutely master anything "programming" related, it'd be Martin Shkreli. The programming environment: Microsoft Excel. https://www.youtube-nocookie.com/embed/fASInVKShnM https://www.youtube-nocookie.com/embed/fASInVKShnM
- brabel 6y agoLots of people here seem to think they know what mastery looks like, but to tell whether someone is a master in something takes another master. And I doubt most of the people who think they are one, actually are. I will try to avoid doing that myself, specially I will avoid implying I am one, but I think it's possible to come up with a few criteria to help you "judge" the level of mastery one has in software engineering: * can create a project from scratch without pondering forever about each and every choice, while picking reasonable choices that, together, approach optimality given the circumstances (notice that this depends mostly on the team/company involved so there's not one right universal answer). * can break up the work in manageable pieces so that progress can be made (regardless of how many people actually work on the project) and measured easily. This is really hard and can only be done properly by a practitioner (meaning, no, your PM can't do that for you). * can establish a good base design that facilitates achievement of the project's objectives (e.g. if performance-focused, then architecture might differ significantly from a more maintainability-focused one). * knows to apply the right amount of testing/automation (too much or too little can be damaging). * can focus on the task at hand, avoiding unnecessary work (many great technical developers fail to do this due to their preference for harder challenges that may not be the right ones to address). * can communicate well (because knowing it all but not being able to pass the knowledge on or convince others will cause most of your knowledge to become inaccessible). Notice that to be able to effectively rate a person or team against each criterion is itself something subjective sometimes, so you won't get a clear-cut answer no matter how you look at it... but I am sure that there are ways to use metrics for each one, though we all know the problem with metrics (people will game it), so yeah, it's difficult to figure this out. Just make sure you don't fall into the trap of judging people solely on subjective grounds though as our natural biases are quite crippling (see psychological studies about human bias) and will cause you to misjudge others, sometimes disastrously.
- INTPenis 6y agoIn my experience it means you rarely write software but you've moved into architecting software platforms and telling other people how to write software. I'm just a devops guy but my current project is like that, where our lead architect has really impressed me by drawing up the design of a very scalable system. My task is merely to implement and manage kubernetes for it and we have other devs who are using java, .net and golang to write the components. This impresses me a lot how our lead can come up with such a design and make it work from paper to practice.
- EliRivers 6y agoJust so. A lot of the problems have already been solved before anyone starts typing code. It is SO common in this industry for people to literally not know what some software is meant to do, and just start typing code anyway. There's an entire software philosophy, "agile", based around that. If it IS known in advance what the software is meant to do, the quality of software that can be created is just astounding.
- pbourke 6y agoIf you rarely write software then you are not moving towards mastery in engineering it. There is no such thing as a master painter who is primarily a manager of painters. You can be a masterful manager, can deliver much more value than a single programmer, etc. But the engineering of software occurs primarily in the thinking about and directly working on it in its specifics.
- INTPenis 6y agoI see what you mean but it's more nuanced than that in my case. It's not like he turned 50 and suddenly stopped coding. I'm talking about a real nerd, a person who codes even on their free time. And he still writes code in other projects, he's a consultant, but in our project he's not touching any code, only advising. And he's 50+ now so he has 15 more years until retirement. Of course I've seen people here work beyond retirement because our field is so easy on the body.
- selimthegrim 6y ago
- raghav_nautiyal 6y agoWho is John Galt?
- johndoe42377 6y agoIn the field of programming languages design and implementation look no further than Erlang, MIT Scheme (a true gem), GHC, Scala and Go. Those are creations of exceptional masters. For smaller projects take a look at nginx, Tokyo cabinet (a DB), redis, and, perhaps, python's requests and Clojure (one man's effort to unify obvious things). Again, these are masterpieces, not just merely good things.
- ExcavateGrandMa 6y agoAs a master... I sit in front my computer and write program(s) from all kind (with and without refs)... using either libs or not... This is not what I think... This is what it is. Gl...
- kcorey 6y agoSoftware Engineering doesn't exist in isolation. You can't master Software Engineering without mastering interfacing with the rest of the organisation. I don't care how intellectually pure your implementation is or how fast you deliver things. If it can't easily connect to, use and get used by the rest of the business, it's a folly. A master of software engineering delivers what the business needs in the minimum time possible. Some businesses care about maintenance. Some don't. Some care about UI/UX, others with a trapped audience don't. Some care about efficiency and optimisation, others don't. You can't be a "master" until you have a sense of what your business is interested in. Not what it CLAIMS to be interested in, but really cares about. It's been different in every company I've ever worked for. Good luck.
- yagizdegirmenci 6y ago> Some businesses care about maintenance. Some don't. Yes, that's right. It's also a choice. You don't have to work for a company who does not care about maintenance. At least I wouldn't, people should have own their standards. With that codebase you are going to spend your 1/3 of your days. It really matters.
- deleted 6y ago[deleted]
- anonytrary 6y agoShip more, talk less.
- kissgyorgy 6y agoUncle Bob Martin coined the term "Software Craftsmanship", you can watch his talks about the topic. I intend to follow it throughout my career.
- EliRivers 6y agoAmongst other signs, they make it look effortless by identifing problems long before they become problems and taking small steps now to make a better future in a few months time. I don't see them engaged in "heroic" coding marathons to desperately get something fixed or delivered; they already fixed it weeks or months ago.
- knadh 6y agoMastery is difficult to quantify, especially in terms of code or engineering cleverness. I think, what comes close, is the ability to get way more tradeoffs right than wrong, to hit an optimal balance. Tradeoffs in decision making when it comes to picking technologies or languages, or a certain design pattern, or an architecture, or UI/UX or whatever, when building systems. Small tradeoffs that may not look like much immediately, but pay off in the long term. Sacrificing a seemingly good feature now to avoid the pain of technical debt in the future. Many of these traits are fundamental, universal, and even philosophical, than is general perceived, and transcend technologies and stacks, and to a large extent, time. And yet, I think, the above traits can be described as good, and not really mastery in its truest sense, like in other disciplines like music or painting. Software engineering is way too diverse, fragmented, chaotic, and ever changing.
- phendrenad2 6y agoMastery of software engineering means, given any task, you can do it, at any point along the fast/correct/cheap triangle gradient. In a corporate environment, you might lean toward fast and correct. In an open-source context you may lean toward correct and cheap. At a pre-funding startup, building an MVP, you may go with fast and cheap.
- friend-monoid 6y agoI think a better wording is “you can learn how to do it”; treading new waters is a daily task for software engineers.
- jonathanstrange 6y agoMasterful code has some kind of straightforward simplicity. Every function does one thing and does exactly what it is supposed to do. Everything is very predictable and boring. You can see from the code how clearly the programmer was thinking and how well the program structure was planned.
- habosa 6y agoI don't think there is one answer but there are a few things I have noticed in my short career so far: * I think an intermediate level of mastery is when you realize that a computer is a logic machine built to serve humans and it will always listen to you if you're willing to put in the effort. You can always go a level deeper. Great engineers know all of the tools at their disposal and will bend the computer to their will if they need to. At the same time, they know the difference between a great low-level solution and a shoddy hack. * Our industry is one of the few where we spend the majority of our time fixing our own mistakes. We call these mistakes "bugs" but they don't just appear, we produce them. The best engineers produce fewer bugs than they fix and rarely end up in a "whack a mole" situation where fixing one thing breaks another thing.
- J-dawg 6y ago> I think an intermediate level of mastery is when you realize that a computer is a logic machine built to serve humans and it will always listen to you if you're willing to put in the effort. You can always go a level deeper. Great engineers know all of the tools at their disposal and will bend the computer to their will if they need to. I've worked with some people who definitely seemed like "masters", and this was true of all of them. Quiet patience and an unshakeable belief that this thing is going to be fixable, even after trying multiple things that have gone nowhere. And they're almost always proved right. It also made me realise I need to get out of this business as soon as possible, because I'm the polar opposite. After a few failed attempts my brain goes into panic mode and the problem seems insurmountable. Then I "wake up" an hour later after a bout of procrastination, no closer to a solution. I often wonder about the chicken and egg of how people attain this state. Are they first and foremost technically brilliant, and the confidence emerges from that? Or is it more of a personality type that has allowed them to solve lots of problems and become technically brilliant along the way?
- Aeolun 6y agoIt’s more a type of persistence I think. More junior people often ask me something along the lines of “How do you immediately know these things?”. But the answer isn’t anything magical. Generally one of: 1. I’ve run into the same or similar problem before. 2. I wrote the code that does this thing.
- DarkWiiPlayer 6y agoI'd say the key point is the ability to identify and reason about complexity. Figuring out what the irreducible complexities of a problem are and at what tradeoffs these complexities could be addressed in different components of an application (including handing them off to the user). A few corollaries of this are: - Masters will write less code, as they will eliminate most of the complexity when there is time for this. - Masters can more easily put the complexity where they want it, having more control over trade-offs between performance, usability, flexibility, etc. - Masters will have an easier time estimating the required work needed to implement a project, as experience gives them a good intuition for what the irreducible complexity of a problem is. - Masters will rarely tell you a "right" solution except for simple problems. Their answer will depend as much on your specific requirements as the problem you're trying to solve[1]. - Masters will often fix problems by simplifying code. Refactoring will be a natural part to their coding workflow, not a separate "housekeeping" activity. - Those who hide complexity behind more complexity are not masters. Those who always fix problems by adding more code are not masters. [1] It could be argued that "add to numbers and do it fast" is a single problem and that's not wrong. Requirements like "speed" and "usability" are really just another aspect of the desired outcome of a program, but it's rarely thought of as part of the problem to be solved, thus I am considering these constrains as separate from the "core" of the problem.
- GistNoesis 6y agoI think of tool makers. Software engineering, gives you some degrees of freedom, therefore it's kind of an art form. Therefore mastery is about intent and the ability to realize it. In this canvas, you can ask yourself, is the bearer wielding the tool or is it the other way around. For me a proficient tool user is no master until he makes his tools his own. He can become one either by creating them, or by understanding them deeply enough that he could recreate them. There are then various levels of mastery and mastery over various sizes of domain. Levels are more about the capacity of imagining new tools, and having new visions in order to advance your field in some interesting way. Growing domain size is about trying to have bigger and bigger tools while still retaining control over them.
- indymike 6y agoThey build better software. They are both strong contributors individually, and strong team members. Better is relative to whatever the purpose of that software is. If it needs to be fast, it is. If it needs to be secure, it is. If it needs to be made quickly, it is.
- bumbada 6y agoThe ability to master complexity. A master will be able to understand the relationship between systems so he can reduce combinatorial possibilities and reduce complexity to a minimum. In other words, a master will not shoot herself in the foot. She will also not let others shoot themselves in the foot. Then, depending on what you do, you will need technical ability: -Understanding basic physics or economics or whatever you interface with your software. -Understanding of low level systems (assembler and C) -Understanding of different paradigms(objects, functional) -Understanding of very High level systems (Lisp, Haskell) -Understanding of serialization(parsing and binary) -Understanding communications. -Understanding data handling. -Understanding interfaces(like command line, desktop or Web). -Understanding standards. But this depends on the particular work you need or want to do. You will be stronger or weaker in different areas. But complexity handling is common to any area in engineering.
- xyproto 6y agoIMO: The ability to judge risk in terms of time and money. The ability to judge the amount of security that is needed (a productive level that is still safe). To think long-term, in terms of avoiding complexity buildup over time, and in terms of avoiding vendor lock-in. To help others get up to speed. To stay productive over time. To stay open to learn something new.
- leowoo91 6y agoThey're the ones who understand there's no silver bullet for all problems.
- rramadass 6y agoSee the paper linked in this thread by user "still_grokking"; it answers your question.
- lincpa 6y agoThe Grand Unified Programming Theory: The Pure Function Pipeline Data Flow with Warehouse/Workshop Model 10 Principles of system design: Take Warehouse/Workshop Model as an example https://github.com/linpengcheng/PurefunctionPipelineDataflow https://github.com/linpengcheng/PurefunctionPipelineDataflow
- gitgud 6y ago"Software" is the implementation of logic. "Engineering" is solving problems with science, within a set of constraints. Therefore software engineering, is solving problems with logic, within a set of constraints. Where constraints can be; business requirements, hardware limitations, development time limitations, performance limits, solution simplicity, release frequency... Etc Mastery of software engineering is efficiently solving problems, and optimising for the constraints that matter...
- HellDunkel 6y agoNintendo, Doom, Unreal, Maya (not Autodesk), Nuke, VRay... beautiful products altogether. Its almost always teams of people but leads are key.
- GuB-42 6y agoNothing specific to software engineering. But I'd say a master is simply someone you have a lot to learn from. I'd say you have mastered the discipline when even though you know the limits of your abilities and you are eager to learn, it becomes difficult to find someone to teach you something new.
- fancythat 6y agoLook no futher than this: https://archive.is/NCWmz https://archive.is/NCWmz (Wolfenstein 3d iPhone development By John Carmack, Technical Director, Id Software) To be exact: "The developers came back and said it would take two months and exceed their budget. Rather than having a big confrontation over the issue, I told them to just send the project to me and I would do it myself. Cass Everitt had been doing some personal work on the iPhone, so he helped me get everything set up for local iPhone development here, which is a lot more tortuous than you would expect from an Apple product. As usual, my off the cuff estimate of "Two days!" was optimistic, but I did get it done in four, and the game is definitely more pleasant at 8x the frame rate. And I had fun doing it."
- uhtred 6y agoNot doubting his greatness, but It's definitely a lot easier to be motivated to work harder and faster when it's your own idea/project. I assume for the team of developers it was just another project their employers were asking them to work on, with all the expected nonsense (rituals) that come with it, and so why would they want to bust a gut / work 20 hour days / care more than they are being paid to care, to get it done in 4 days.
- andai 6y agoTwo months of weekdays is about 40 days, so they would have be 80 hour days. (Although we also forgot to multiply by the number of people on the team...)
- fancythat 6y agoI agree with you, but judging by the whole article the main thing here was probably the same old story with outsourcing company either wanting to bill extraordinary amount of hours or employing novice to medium developers for the project but charging full senior price for them. I guess that for most of the guys, if they had opportunity to work on something with Carmack or Id Software in those days, it would be a priority to show yourself in best light and even work for free or heavily discounted price if needed to secure future deals. Especially since all source code was provided and basically the whole thing was just somewhat simple porting engagement.
- Daub 6y agoA simple requisite of mastery in any domain is age. Not to say that young people can't be brilliant and impactfull at their craft. But such qualities fall more rightfully described as having flair. The difference between mastery and flair is that the former is more reliable and stable. As an art teacher, I have seen many young artists go on to have great careers shortly after leaving school... but most of them burn out or fail in one way or another. Conversely... their aged teachers have acquired character, depth and stability but have in the process lost their wildfire.
- revskill 6y agoProblem solving skills. It doesn't matter if your tool is the best, it only matters which tool is suitable for the job. So the master to me is the one who knows which tools for which job !
- Bandrsnatch 6y agoMastery in Software engineering is the ability to conceive and design a program or app in ones mind and then build it and have it work flawlessly. In my experience when a company wanted something done they set up a small team offsite with little corporate oversite. This is why small startups drive innovation. Simplicity is genius and is often seen by users as magic.
- simplecto 6y agoActually coding something is the last resort.
- m3kw9 6y agoUltimately where you want to be with soft eng. is where you can produce and deliver value, regardless of mastery. That includes communication and steering of projects to value
- collyw 6y agoSomething that makes sense to the next developer without too much effort (assuming that it works).
- lawwantsin17 6y agoWorking knowledge of the whole hardware and software stack and a masterpiece to show it.
- adampk 6y agoAn opinion from a Product Manager: When you truly "trust" the engineer. You know their opinions are honest and well thought out. They do not have junior dev energy of saying "two days!" optimistically and not old beard energy of "it can't be done, you won't be able to launch it". "Master" really is a great word for it, you have complete faith in the individuals word.
- ma2rten 6y agoThis means they never work on things they have not worked on before.
- adampk 6y agoI am not sure that it does. Honestly responding with "I haven't tried that before" seems to be harder than it sounds. I would trust a master to take the appropriate amount of time to do a research spike or to bring in the right people in and understand how to get going.
- MathematicalArt 6y agoINTRO To answer this question, one must first operantly define what mastery is. So what is mastery? To start, mastery is something on which one can be on the path towards, yet mastery is also a thing which has been achieved. So we need to talk about flow along a path and achievement of the objective. PATH The path to mastery is characterized by humility and child-like exploration combined with an intrinsic drive to integrate learning a and take paths that make individual sense to one on the apprentice’s path towards mastery. It is concerned with thoughtful action and adaptation. The ultimate focus is on the seeking of truth (an intrinsic reward) rather than and sometimes at the detriment to receiving external rewards (accolades, financial renumeration, and other materialistic artifacts). Such sacrifices and focus is made early in the mastery process and pay off once one inevitably achieves it. This is a pattern common in most individuals we would consider to be masters and the difficulty lies in staying on such a path despite internalized intuitions and the listening to an internal voice/drive pulling us away from society, the majority of who are not on the path at any given time. Mastery is high risk because it a deviant process often focusing on long term rewards rather than instant gratification or even short-term survival. ACHIEVEMENT OF What can a master do? Why is that beneficial? Mastery is the seamless ability to fuse the intuitive with the rational while performing and understanding at a high level of competency in a given discipline or domain. It manifests as as such a deep internalization of a domain that one is able to spend cognitive effort on seamless cross-pollination between other disciplines, sculpting domains at will. Mastery is only achieved through embracing the humane, which means internalizing the fact that what makes us human is the blending of the rational (a step-by-step-step process) with the intuitive (a distributed and probabilistic process). MASTERY IN SOFTWARE ENGINEERING What is engineering? What is software? What commonalities do they share? Given a definition of mastery, we see that the question of what engineering and software are next to be defined. These three questions should serve to form a foundation for discussion. Engineering is the process of designing reliable processes and systems given constraints on resources, tools, and available thought patterns. It is also fundamentally concerned with risk management on the path to achieving an objective. Software is a system which interfaces with either humans, machines, or both to achieve an objective. It serves as a medium for sending conceptual communicative signals across, within, and between various levels of abstraction to include physical computing done at the level of hardware. As an aside, it must be stated that the delineation we place between software and hardware is an arbitrary though sometimes useful fiction to allow us to get tasks done. With this being stated, such a simplification is often over-used to our collective detriment. The master software engineer understands hardware and software deeply at both the intuitiveness rational levels in order to design systems and process to specifications and with clarity to both machines and humans alike. This ability to provide and communicate with clarity is especially important when we consider that our colloquial models of machines themselves are over-simplified, a fact that one will quickly become aware of when trying to design applications across platforms that perform “low level” file system operations. In this case, it becomes apparent that even operations such as opening and closing files, tasks which one would think are stable and solved problems, have such variability that cross-platform development is more challenging than it should seem. Not only does a master software engineer have the ability to communicate at different levels of abstraction of hardware and software—such a master also recognizes that communication is the operant word. Communication is signal propagation, filtering, and more, occurring at the personal, interpersonal, and organizational level as well. The master software engineer is seamlessly able to apply all principles of software development to psychological phenomena as well. To such an individual, there is no difference conceptually from a root pattern perspective.
- wkoszek 6y agoAbility to: Start small with a shitty demo which can get buy-in from other folks on a team and continue pounding out high-impact features in no time first, to sell the invention to anyone. Then get this demo cleaned up to the point it ships with docs, tests, telemetry in production, and there are no bugs and crashes. Just couple of improvement requests. And when this thing can be enabled/disabled dynamically, and enhanced/expanded for the future without major rewrites.
- deleted 6y ago[deleted]
- rswail 6y ago1. Understand that Software Engineering is not a discipline yet. There are some foundational elements, but the field is less than a century old. 2. Think in the abstract. Implementation details are just that, details. 3. Ideas and concepts can be reused, code reuse (in business logic areas, not technical support) is rare. 4. "Design is about constraints" - Charles Eames 5. Understand the foundations, finite state machines, what REST as a style actually means, why Nouns are more important than Verbs, don't reinvent things... 6. Learning never ends.