I am Robert C. Martin (Uncle Bob). Ask me anything.

24 January 2019, 8:00 pm

Hey there, 👋

Most of you might know me as Robert "Uncle Bob" Martin from Cleancoder.

I am a software professional since 1970. I have spent the last 40 years contributing toward the betterment of the field, from kickstarting the Agile Alliance to authoring landmark books about Agile Programming, Clean Code, and more.

This is your opportunity to ask me anything regarding programming on Hashnode. I will start answering them live from 2 pm CST on 24th January.

Learn Something New Everyday,
Connect With The Best Developers!

& 500k+ others use Hashnode actively.

Comments (129)

Sandeep Panda's photo

Hey Robert! Thanks for the AMA! 🙌

Which of the current trends in Software Engineering are overrated? What practices in SE has changed for good since 1970?

Robert Martin's photo

Overrated? At the moment, Microservices.

Changes for good since 1970? Agile. No question. Agile is the acknowledgement that discipline overrides ceremony in software development.

j's photo

Hey Robert,

I read your book Clean Code and listen to some of your talks like 'the future of programming' and 'the principles of clean architecture' which I enjoyed.

To my questions:

  • Do you still actively code?
  • What Language Families do you like, Wirth? C-Like? ML? Fortran?
  • Do you still got the time and the nerve to follow current trends within the language ecco-systems?

Thx for your time :)

Show +1 replies
David Domingo's photo

Software Engineer with a frontend background

Hi Uncle Bob,

I am currently trying to learn a Lisp for fun and Clojure is my first choice because of Clojurescript. But what is it about Clojure that makes it your go to language?

Thank you for your time :D

j's photo

David Domingo you need to tag him so he gets a notification :)

Eric Lemes's photo

Thanks for this opportunity. I've read all your books, including some very old ones (like the C++ in Booch method) and they are all great. You influenced a lot my work and I'm really grateful for so many interesting ideas.

I wish I could ask one, but it will be a lot.

I've been working a lot with code metrics or any objective ways of measuring code quality based on static analysis. I've been getting some interesting data about this which I can discuss if you are interested. I've seen some suggested metrics, specially in Clean Code, about number of lines of code, number of arguments per method, coupling etc. and that's why a lot of my questions will be directed towards measuring code coverage and TDD (since there are loads of studies showing that TDD improves code quality).

  • Do you believe it is possible to objectively measure code quality analyzing code structure (number of lines, cyclomatic complexity, afferent and efferent coupling, code coverage)?
  • Do you believe good design can be measured objectively?
  • I've seen a lot of discussion in C++ about dynamic polymorphism being a performance issue (since it disables a lot of opportunities for compiler inlining, and since adds a pointer per class, can increase cache misses). What are your thoughts on this based on games or any other CPU intensive applications?
  • I know this is a curve ball, but, what do you think would be the ideal unit test code coverage (line and branch)? Why?
  • Knowing ideal code coverage can be tricky and sometimes irrelevant, what would be the lower limit? For examples, is 10% of code coverage relevant?
  • What would be the threshold when you start feeling improvement?
  • I've heard a lot of people stating that you can achieve high coverage numbers (for example 80%) and still have a pretty bad code. What are you thoughts on that?
Robert Martin's photo
  • Do you believe it is possible to objectively measure code quality analyzing code structure (number of lines, cyclomatic complexity, afferent and efferent coupling, code coverage)?

    You can get some information from these metrics. But you cannot determine code or design quality from them.

  • Do you believe good design can be measured objectively?

    Not with static analysis metrics. But I think good designers can pass appropriate judgements on good or bad design. In the end, there is only one metric that matters: Was the manpower required to build, deploy, and maintain the system appropriately minimized.

  • I've seen a lot of discussion in C++ about dynamic polymorphism being a performance issue (since it disables a lot of opportunities for compiler inlining, and since adds a pointer per class, can increase cache misses). What are your thoughts on this based on games or any other CPU intensive applications?

    When you need to save 3 nanoseconds, dynamic polymorphism is a factor. So in deep loops with tight real time deadlines, removing dynamic polymorphism is an option. In all other cases the cost is so small as to be nonexistent; and the advantages are so great as to be overriding.

  • I know this is a curve ball, but, what do you think would be the ideal unit test code coverage (line and branch)? Why?

    100%. Line and branch. Obviously. Of course you can probably never achieve this level; but it should still be the "ideal" (your word).

  • Knowing ideal code coverage can be tricky and sometimes irrelevant, what would be the lower limit? For examples, is 10% of code coverage relevant?

    Lower than 100% means you aren't done. Of course you 'll never really be done. But there is no stopping point lower than 100%.

  • What would be the threshold when you start feeling improvement?
    I've heard a lot of people stating that you can achieve high coverage numbers (for example 80%) and still have a pretty bad code. What are you thoughts on that?

    If you have 80% coverage, it means that 20% of the code might not work. That's not a good number. No one should be happy about 80% coverage.

Nick K's photo

What do you think about Go (golang) language? It's structs, embedding/composition, no inheritance, interfaces? Error as a value? Concurrency model? Do you think those decisions made in the golang design are actually smart and make sence for the problem they are trying to solve by creating and maintaining golang? (generics will be released soon)

Solly Shehata's photo

Cloud Platform Engineer

Robert Martin Hey Uncle Bob, I hope to see your answer on this.

Chilon's photo

Hi Robert, I have a question regarding integration testing.

Let's assume that we have a project where several classes/modules have been developed using TDD (possibly by different developers). This implies that communication between these classes has been mocked out, so there might be a bug/incompatibility hidden in their communication once we integrate them (e.g. class A calling foo() method of class B, but class B object is in a state where it does not expect foo() to be called).

Occasionally we have such bugs slipping to production in real projects. Even though we have integration tests where class A calls method foo() of B (so the glue/adapter code is covered by the tests), B is not in the erroneous state that will expose the bug.

So my question is, what is your approach on enumerating which integration tests to write? It seems that writing just enough tests to cover the glue code is not enough. On the other hand writing integration tests that verify the communication of objects in every possible state increases the number of tests exponentially. What's your advice?

Show +2 replies
Conrad Taylor's photo

Having Fun With Tech

I tend to write integration and unit tests for each feature to drive the implementation of user story from the outside in (i.e. BDD).

Next, the very goal of integration tests is exercising the expected assumptions of these connected components. The very goal of the unit test is exercising the expected assumptions of the individual component.

If either the integration and/or unit test is insufficient for the components or component under test, then it's definitely possible to receive errors when the code is exercised in a context in which it hasn't been tested.

In summary, one shouldn't expect an insufficient integration or unit test to catch errors when the code is being exercised outside the context for which has been tested.

Chilon's photo

Conrad Taylor, I completely agree with your points.

My concern is that we do not have a structured way/methodology for writing sufficient integration tests. For unit tests we have TDD, which by definition leads to a test suite that covers the whole unit (there is also mutation testing). But for integration tests we do not have a similar methodology.

I also follow a test-first approach when writing integration tests. That way the glue code that connects the units is not written until there is a failing integration test. But as I explained in the original question, these tests do not seem to be enough.

One way of mitigating the problem is to minimize the chance of developing incompatible units by pair/mob programming. Still this leaves room for bugs slipping through due to the human factor involved. Another way is to write tests that exercise the contract of units developed by different developers/teams (as Robert Martin proposed), but this would require lot more tests especially if done for each unit.

Aleksa Boškov's photo

Hey Uncle Bob, thanks for doing this one. I have a question regarding TDD and how it fits into planning and estimation.

I'm working at a company that values technical task breakdown and somewhat accurate estimations. By practicing this, we usually get the design and separation of major components nailed down before the development begins. Now, this doesn't work very well with TDD as I already kind of have my design laid out.

How would you approach this, and where do you think is the fine line between planning and estimating and letting tests drive the design?

Cheers.

Adam Romney's photo

Watching Uncle Bob's Bowling Game TDD demo might address part of your question. In the demo he puts forth a planned design for the problem then walks through the TDD approach and compares the result to the design. So perhaps the planned design is useful for estimating but actual implementation ought to be done via TDD.

Matt Madson's photo

How do you handle more senior engineers who are resistant to evolutionary design / iterative refactoring and TDD? How best do you shape the hearts and minds of your fellow colleagues.

Robert Martin's photo

Tough question. You can try to change people's minds, but don't expect much. People don't like to change their minds.

The best strategy is to be a role model. Adopt the disciplines yourself, and allow people to follow you. You can do some lunch-and-learns, and you can talk with folks about the benefits.

In the end, you are likely to convince a few people. But the majority will not be convinced.

This divides the programmers into two populations. These two populations have very different values. People from those two populations find it very difficult to work together. In the end they will separate. People who like TDD will tend to congregate within the same company, or may leave in search of other companies who share their values.

This migration in search of values has been going on for twenty years now. There are whole companies who have adopted TDD/Refactoring etc. I expect them to outperform those who don't.

Rafal Lesniak's photo

Do you agree that base your career on a specific language is like throwing a lottery ticket?

Robert Martin's photo

Every programmer should know many language. Dave Thomas and Andy Hunt once said (in "The Pragmatic Programmer): Learn a new language every year. This is good advice.

Every programmer should know a C based language like C, Go, Java, C# or C++. Every programmer should know a functional language like Clojure, or F#. Every programmer should know a stack based language like Forth. Every programmer should know a logic language like prolog. Every programmer should know LISP.

And that's just for starters.

John Welty's photo

Have you done any more work with Transformation Priority Premise?

Robert Martin's photo

No, though some other folks have.

Radek Falhar's photo

Hi Robert,

You are quite (in)famous on some places on the internet. On /r/programmers, any of your articles is immediately downvoted and even mention of your name is quick to produce negative reactions.

How do you feel about such kind of negative reputation? Do you know of anything that you have said or done that you would deserve such negative popularity? Have you, or would you do something to fix your reputation?

Kapralov Sergey's photo

People who really deserve respect and have something valuable to say will always draw haters attention. People who have no haters behind are boring and have no own position to stand for.

Robert Martin's photo

I don't know what /r/programmers is. I am aware that there are folks who don't like my message for one reason or another. That's fine. I believe in the marketplace of ideas. If their ideas are better, their ideas will win.

Some folks don't like the fact that I am a conservative, and a republican. Some folks don't like the fact that I voted for Donald Trump. That's fine. I believe in the marketplace of ideas. If my politics is wrong, then it will lose.

Meanwhile, I've been a programmer for 48 years. That's something of a rarity. Very few people alive have been coding for 48 years straight. That sheer level of experience puts me in a position of some authority. I'm also a tolerably good writer, and that helps.

Anyway, there's room for all of us here.

Ben Buchanan (200ok)'s photo

What are you most excited or surprised about in present-day programming?

If you could replace any one piece of advice you've given in the past with a new one, what would it be?

What's the best non-code/non-technical thing someone can do to be a better programmer?

Robert Martin's photo
  • What are you most excited or surprised about in present-day programming?

The fact that Agile -- especially the technical practices -- are continuing to gain ground inside the programming community. And of those, most especially, Test Driven Development.

  • What's the best non-code/non-technical thing someone can do to be a better programmer?

Read and write. Read a lot and write a lot.

Jesiel Viana da Silva's photo

Hey Robert, What do think about Node.js? Do you code today?

Robert Martin's photo

I don't do much javascript coding. I've never used node. I'm hoping I can skip over thew whole Javascript thing and use Clojurescript instead. <grin>.

k's photo

Hi Uncle Bob!

I'm working on a mobile banking app. Most of the business logic is handled through the backend API, the app code is for making API calls, presenting data and navigating the user through flows.

My question is this - what constitutes the "core business logic" of such an application? Is the iOS-specific view layer the implementation detail? Is the API layer the implementation detail? Are both of them?

Mikaeil's photo

Hello Uncle Bob! Thanks for the AMA and your work on the Clean Coder series. I have 3 questions:

  1. I've read books on TDD and OOP (like yours), but a lot of these ideas have been around for decades. Do you think there will ever be more groundbreaking ideas like TDD or SOLID? Is this the end of history for best practices in programming?
  2. Given how many new developers enter the industry every year, is it possible that we're in a tech bubble which will eventually burst?
  3. Are there any specific reasons why Python is not usually discussed in books and talks about OOP best practices?
nico's photo

Hi there, so, how terrible do you think "serverless" is ?

Huseyin Ergin's photo

Hi Robert,

1) What do you think of a CS education to be a software engineer? Is it totally useless or you see some value in that?

2) If we would like to build a software engineering course based on agile and want to divide it into 6 pieces. What would they need to be? (i.e. waterfall has these requirements, design etc etc.)

Thanks,

Robert Martin's photo

1) What do you think of a CS education to be a software engineer? Is it totally useless or you see some value in that?

That depends on the school. At some schools it is entirely possible to get a masters level degree in computer science without writing a line of code. That's just nonsensical. On the other hand, there are schools that do a pretty good job of getting your fingers on the keyboard.

Overall, however, I do not think CS degrees are necessary, or even worth the cost. Software is a trade that can be learned on the job via good apprenticeship programs.

2) If we would like to build a software engineering course based on agile and want to divide it into 6 pieces. What would they need to be? (i.e. waterfall has these requirements, design etc etc.)

Pick 6 projects, and run each one of them all the way through to completion. Use all the Agile disciplines in each. Teach the students by doing.

Flavius's photo

Hi Robert,

I know you ran away from the C++ standards committee.

With that in mind, what do you think about rust's lifetimes and ownership, and generally about rust and its future in the programming language landscape?

Can you explain each of the SOLID principles in the context of rust (including traits)?

Robert Martin's photo

I was never invited to be on the C++ standards committee. Had I been invited, I would have declined. I hate bureaucracies. I don't want to haggle over little tiny language features. I want to code.

I know absolutely nothing about Rust. I may look into it one day; but there are so many other things to look into. Decisions, decisions.

Jairo's photo

Hello, I'm new at developing with C#. it is a good practice to always return IEnumerable<T> and receive IList<T> in my methods when dealing with collections or should I favor the use if IEnumerable<T> for both, in and out?

Robert Martin's photo

The best practice is to use the smallest interface that provides the methods that your callers need to call.

Kapralov Sergey's photo

Hi Robert.

I am a fan of your design metrics (linux.ime.usp.br/~joaomm/mac499/arquivos/re..) and the "Zone of Pain" term you described in "Clean Architecture". It changed my vision on what is maintainable code drastically.

However, originally you outlined those concepts for a set of classes, calling it "class categories". My question is: why can't the same metrics be applied to classes and interfaces per-se. They are a subject of reuse in OO code as well, and stable-concrete classes will inevitably be the source of pain and regressions, when the time to change something comes.

Also, what do you think about DI frameworks, which do injections by means of annotations (like Spring's 'Autowired' or CDI's 'Inject')? Aren't they break stable dependencies/abstractions principles, making implicit direct dependencies between our components?

Show +2 replies
Daniel Hiller's photo

Regarding abstraction vs. concretion, I think that programming against the interface vs. the concrete implementation is a good thing. This enables to replace the concrete implementation with a mock for testing.

OTOH in my experience you seldom need more than one concrete implementation, and if you do, you have a strategy and their implementations. For those cases you need to have separate configurations anyway, each based on a certain case.

As you are mentioning Springs @Autowired here, you could create @Configuration s for these cases, which would enable you to define the required dependency externally. Each of these could be enabled by a @Profile when appropriate.

I'm guessing that you mean to be able to very easily shoot yourself in the foot by overusing it, which I completely agree with. But most of the time it saves me personally from writing the boilerplate code of object creation and composition, which I think is good

Kapralov Sergey's photo

Daniel Hiller

OTOH in my experience you seldom need more than one concrete implementation, and if you do, you have a strategy and their implementations.

I disagree. You are right, interfaces are often designed in "service" way, and usually implemented once or twice, but IMO it is severe mistake. Interface is meaningless if it is designed for just a few implementations. Only the interfaces which has potentially infinite number of implementations truly enable OCP. For example:

interface Light {
    void on();
    void off();
}

Interface Light from example. It can have plenty of implementations, which are able to turn on and off smart lights from different vendors. Also, it can be implemented as a fake object for test purposes. It can have composite implementation, which enable management of group of lights in one shot. Any customer's demand related to turning on and off the lights can be implemented behind this interface. Such characteristic is achieved because Light is completely purified from technical details. It is true stable abstraction, the one that is always safe to depend on.

In such curcumstances, if all interfaces in a system are designed with this consideration in mind, the strategy pattern, spring profiles and autowired injections become really crooked and inflexible.

Nope's photo

Dear Uncle Bob,

From what I understand, you define OO as disciplined indirect calls / inversion of control (e.g "when old code calls new code"). Which makes it a tool to manage dependencies (by strategically inverting some of them, you get to fully isolate some parts of your system from the others).

James Coplien's definition seems a lot more related to modeling the domain (the "real world" ?), and seems very tied to UI and more generally what the user "sees" or "manipulates" ; and seems not to apply to non-interactive programs like a webserver or a compiler. Also, there seem to be a lot more upfront design in the way he works, which makes it clear from the start that you are required to have a solid understanding of the domain.

We also have Alan Kay's definition of OO, which is more related to the "fire-and-forget" (unidirectional?) style communication between the different parts of the system ("message-oriented programming", from his own words).

To make the matter worse, we also have the "definition" that "OO is putting related data and functions together", which conveys almost no information (as we've been doing this for decades, as soon as we were able to split code into several files).

Are all these definitions different ways to see the same thing? Do they lead to the same architectures? Is it possible to reconcile them, and should we?

Thanks for your answer, and thanks for all the answers you already provided to our profession!

Eric Lemes's photo

Thanks for this opportunity. I've read all your books, including some very old ones (like the C++ in Booch method) and they are all great. You influenced a lot my work and I'm really grateful for so many interesting ideas.

I wish I could ask one, but it will be a lot.

I've been working a lot with code metrics or any objective ways of measuring code quality based on static analysis. I've been getting some interesting data about this which I can discuss if you are interested. I've seen some suggested metrics, specially in Clean Code, about number of lines of code, number of arguments per method, coupling etc. and that's why a lot of my questions will be directed towards measuring code coverage and TDD (since there are loads of studies showing that TDD improves code quality).

  • Do you believe it is possible to objectively measure code quality analyzing code structure (number of lines, cyclomatic complexity, afferent and efferent coupling, code coverage)?
  • Do you believe good design can be measured objectively?
  • I've seen a lot of discussion in C++ about dynamic polymorphism being a performance issue (since it disables a lot of opportunities for compiler inlining, and since adds a pointer per class, can increase cache misses). What are your thoughts on this based on games or any other CPU intensive applications?
  • I know this is a curve ball, but, what do you think would be the ideal unit test code coverage (line and branch)? Why?
  • Knowing ideal code coverage can be tricky and sometimes irrelevant, what would be the lower limit? For examples, is 10% of code coverage relevant?
  • What would be the threshold when you start feeling improvement?
  • I've heard a lot of people stating that you can achieve high coverage numbers (for example 80%) and still have a pretty bad code. What are you thoughts on that?
Alex Vasyliev's photo

Hi Robert, what is your attitude to fullstack developers? Should every dev choose his side one day or fullstack is more effective for professional growth?

Michael Winick's photo

Your Interactor model demands dependencies directed towards the business logic and never from BL outward. DDD also has similar design ideas (Port and Adapters, too). Why haven't you jumped neck deep into Domain Driven Design? I have seen you say positive things about DDD, but you don't come across publicly as an advocate. Is there something with DDD that you find incongruous with your architecture/style?

Michael Bykovski's photo

Hey Robert,

have you ever used workflow engines to program business processes? What is your opinion in making BPMN Diagrams and then put them in such workflow engines?

Thanks a lot. Cheers

Brian Takita's photo

Hello Robert, thank you for all of your contributions to the profession & your courageous stances on numerous debates.

Are you a student of philosophy? Care to disclose your Weltanschauung and how it relates to programming?

Benny Elgazar's photo

What do you think about Go-lang? It success is related to the fact it's backed up by google?

Matt Madson's photo

Hi Uncle Bob,

Read and loved your book--Clean Architecture; curious on your thoughts for how component design and component coupling map to an AWS lambda FaaS world.

Thanks!

Melanie Sumner's photo

I frequently observe young(er) developers trying to sell me something we tried 20 years ago but abandoned for various reasons (especially in web development). I want to find a good way to encourage experimentation, but at the same time, I feel like the industry is continually trying to reinvent the wheel. How do you deal with hype? Do you recommend software professionals stay out of the hype cycle, or lean into it?

Robert Martin's photo

The hype cycle is very real, very distracting, and very annoying. I strongly recommend assessing each "new" thing to come along, and then ignoring those that are just restatements of past ideas.

So, for example, microservices are not a bad idea; but there's been too much hype about them. They are an old idea that has a place, but programmers should not simply be leaping into microservices just because they are "new". Older programmers need to calm everyone down and remind them of the costs of creating hundreds of little services. Those costs are not trivial.

Melanie Sumner's photo

Thank you for the advice!

Lukáš Mešťan's photo

Hey Robert, What do think about Scrum/Kanban?

Robert Martin's photo

Both are fine methods. I prefer Extreme Programming myself. And I really don't like the certification aspect of SCRUM.

Ramon Chiara's photo

What happened to Object Mentor's site??? I liked its resources so much... I'm finishing reading Agile Software Development and there are some links to there. Where can I find them now? GitHub? Thanks for all the knowledge you share and for all the contribution to the programming community!

Eugene Nikolaev's photo

Hey, Dear Uncle Bob!

Do you use any reactive/state management/shadow dom/whatever library while programming on ClojureScript?

Andrew's photo

Hi, what's your flow when you developing solo projects, like do you flesh out ideas on paper? Flowcharts?Pseudocode? Prototyping? etc. Then after you finished coding/refactoring/tdding is that the end for a day or do you do something like reflect on the code.

Masoud Naghizade's photo

Hi there uncle bob , I've gathered a team in far away country based on your books and videos. we do clean coding and clean architecting , as well as testing and we do all the principles of XP and we are indebted to you for these and we thank you from the bottom of our hearts.

We code in kotlin and we really are annoyed by it being staticly typed. We have developed some hacky but ugly ways to use dynamic DTOs .but we really consider your suggestion on switching to clojure as a dynamic and truly functional language.

You are being known for the word CLEAN , then How do you defend clojure being clean and easily read when it really looks ugly?!

Alix Warnke's photo

Hi Bob, in light of your recent tweet, twitter.com/unclebobmartin/status/106958883.. , about bloated programming languages with features that should be implemented in frameworks and your statement, a year ago, that you considered the current lineup of available programming languages to be sufficiently powerful, blog.cleancoder.com/uncle-bob/2017/11/18/On..

Do you consider Kotlin to be a better language than Java?

Bonus question (optional): Is it justifiable, generally speaking, to convert Java projects to Kotlin? If not, what would be the criteria?

עִדוֹ וייס's photo

Hey Uncle Bob! In your first episode about functional programming you said, and I quote: "Functional programming is destined to be the dominant style of programming in the years to come". I was actually quite surprised to hear that from you. Can you give some more detailed explanation about that? And generally, what are your expectations from the field of programming in, say, 20 years from now? Thank you so much for your amazing contribution to this profession, I enjoy Cleancoder so much.

Matias Alvin's photo

Hey Uncle Bob,

I really love your books (clean code & clean architecture) and currently planning on buy your other books. My question is:

  • Do you sell kindle formatted for your books? I can't seems to find it on amazon.
  • With current mobile development trend, where most of it required the software to highly coupled to it. Is it possible to implement clean architecture?
  • What makes you interested in clojure?

Thanks for the AMA! I really love your works, stay awesome Uncle Bob :)

Guo-Guang's photo

Hi Robert,

Could you share any experiences you manage to develop a product from an idea at early stage and how you overcome challenges along the way?

Gabor Juhasz's photo

Hi, when teaching programming to absolute beginners, do you think it would make sense to teach functional style first? I.e. constants instead of variables, no mutability, and (to be able to do anything meaningful) recursion, etc. early on. Thanks

Igor Dimcevski's photo

What are the titles of the last three software engineering books that you have read?

Jonathan Novaretti's photo

What are others books about software design you recommend?

Christian Vásquez's photo

What is the most memorable moment of your carrier?

Mike Albert's photo

Hi Bob! 👋How does your dev toolkit look like? Which IDE do you use?

Frederic Filiatrault's photo

Hi Robert Martin! Any updates on your next book (Agile Architecture)? Last time we spoke, it was due around October 2019. Can't wait to start reading it. Thx!

Nelson Dunahugh's photo

What do you think (about below)? Please correct me where you feel I need insight.

I know it's been some years since you proposed Clojure as the last language. But, considering the importance and benefit of having a last language, shouldn't a little pragmatism be involved? To get straight to the point I see a real possibility for C++. No one owns it and it has been cooperatively evolving . It has momentum for programmers defining it and owning it. It is modernizing yet bridges the past. Allows the programmer to choose a paradigm. It's paradigm limitations can be corrected by evolution. It has proven to be evolvable by an existing cooperation dominated by programmers. Social momentum is invaluable because creating such momentum is a crap shoot and people are fickle. Basically with this broadly capable language there is at least a little leverage that allows programmers to make historical decisions rather than letting computer history (fads) happen to the programmers. I imagine the moving targets (new languages and API's) scattered around are sucking a lot of energy and productivity out of software development.

John Zabroski's photo

Robert Martin I remember being a teenager and finding your posts with H.S. Lahman and feeling like I was uncovering some hidden laws of the universe. Later, in my early 20s, I met several of my heroes at a conference, only to be greatly disappointed to hear they were full of regret. For example, without naming names, one founder of the field of computer science was bankrupt and legally blind due to glaucoma from diabetes (which in turn he attributed to not taking care of his diet).

Here is my big question, that I may even regret asking:

Does your ability to think logically and structure your thoughts on software engineering carry into your personal life?

How do you set goals for yourself, both personally and professionally?

If you were to plot a histogram of your successes and failures, in five year increments, what would that look like? What caused the histogram bars to change over time?

Asad Ganiev's photo

Hi, Robert. I am self-taught java developer. I love java, but besides its annotations.

I think annotations even they seem very lovely and handy, they break Clean OOP Design. And do more harm then help. In my opinion most of java framework overuse it.

Instead of using them I prefer implementing abstraction (interface, abstract class).

Let's say we have an interface Saveable with method save(). When I implement it, the derived will have method save(). But when we have an annotation @Save. And I can annotate any method with any name even

@Save
public void delete(Object element){
     ...
}

And it makes confused other developer who will use this method. It's just a primitive example, but I think you got my point.

Innsa Docs's photo

What goes first? The method declaration or the method call ?

namelesspipe's photo

Uncle Bob, thanks for sharing your wisdom with the world. At my previous job, we watched the Clean Code videos on regular basis and have introduced many new people to you. We've learned a lot, were entertained by your antics, and have also argued with you, but you weren't there to defend yourself:).

1) My first question is, how do I keep learning as an older developer? The constant flow of new languages, technologies seems to be overwhelming, even if I only focus on seemingly promising, important developments.

I haven't been alive as long as you've been programming but I'm getting up there. While I still enjoy software development and learning new useful things, I only have so much room in my short- and mid-term memory, and it seems to be shrinking. In one of your answers above, you recommend learning a new language on regular basis. Unfortunately, in my experience learning anything new means another language/framework/information gets pushed down the memory stack and becomes less available for rapid recall, unless I keep practicing both, but I only have so much time.

Transferrable higher-level knowledge like design principles, patterns, code smells, is valuable and practical for me. Here I'm primarily asking about learning new technologies.

2) Would you strongly advise against narrow specialization? I have been a full-stack .NET web programmer, which some would argue is narrow because there's also JSP, Node.js, PHP (gasp). However, it is still a lot, mainly due to the complexity of web-based front-ends: JavaScript frameworks, transcompilers (TypeScript), client-side file packagers/minifiers, CSS frameworks/"compilers" (LESS/SASS). I've been thinking about narrowing it even further, perhaps just back-end server-side .NET web API's/services in C#. I feel like due to my limitation (see question 1 above) this would be a good way to excel in one area.

Nenad Maljukan's photo

Hey Uncle Bob,

Is there a book or other learning resource you can suggest about walking on the thin red line between Object Oriented and Functional Programming and can you write one please?

Thanks for this great opportunity!

SaundersB's photo

What is the next big movement in software? Instead, do you see our industry encountering a plateau? How can we as software developers prepare for the future? @unclebob

Want to read more?

Browse featured discussions

© 2020 · Hashnode