Codecamp https://codecamp.ro It's about what happens next Wed, 12 Nov 2025 16:04:21 +0000 en-US hourly 1 https://wordpress.org/?v=6.9.4 https://codecamp.ro/wp-content/uploads/2021/09/cropped-logo-symbol-patrat-01-150x150.webp Codecamp https://codecamp.ro 32 32 Codecamp_Festival Iasi 2025 https://codecamp.ro/codecamp-festival-iasi-2025/ Fri, 15 Nov 2024 13:54:08 +0000 https://codecamp.ro/?p=20615

A complete experience

14 superheroes

2 top-notch keynotes

3 stages

New connections

Food and drinks

Networking and insights

Codecamp_Festival is a one-of-a-kind experience, mixing learning from the best speakers out there, from all over the world, with the glitz and glamour of an actual music festival.

Three incredible stages, two inspiring keynotes, seeing your superheroes up close and personal and making new connections, in a laid-back and friendly scenery, who said learning can’t be fun?

The Code Whisperer, Diaspar Software Services, Inc.

Consultant, programmer, technologist, Curbralan

Tech Consultant

Hands-On Software Architect, Independent Consultant, Author

Software Architect & Meme Wrangler, ThoughtWorks

Award-winning author, founder of Agile Developer, Inc.

Technical Director, Thoughtworks

Chief Artificial Intelligence Officer

Data Engineer, Tremend by Publicis Sapient

Technical Designer, VOIS

Senior Data Engineer, E.ON Software Development

Data Scientist, Strongbytes

Leadership Consultant, Introspecials

XR Creative Developer, Colorful Coding

The speakers

Meet the superheroes that changed the game in software development.

Yeap, they’re all coming to Romania! Grab a coffee with them and prepare to be starstruck.

The stages

Woodstock

Factory

Portal

Holiday Village

Masterclasses

These high-end workshops allow you to dive deeper into specific topics related to software development. The masterclasses are taught by experts in the field and offer a more personalized and interactive learning experience. You get to work closely with the instructor and other colleagues in a small-group setting and ask questions and get feedback in real time. Overall, they are a unique and valuable opportunity for anyone looking to expand their knowledge and expertise in software development and IT.

doors open in

Days
Hours
Minutes
Seconds
Secure your place and pre register now

Get the Codecamp app

]]>
Codecamp_Festival Bucharest 2025 https://codecamp.ro/codecamp-festival-bucharest-2025/ Fri, 15 Nov 2024 13:09:48 +0000 https://codecamp.ro/?p=20581

A complete experience

14 superheroes

2 top-notch keynotes

3 stages

New connections

Food and drinks

Concert & afterparty

Codecamp_Festival is a one-of-a-kind experience, mixing learning from the best speakers out there, from all over the world, with the glitz and glamour of an actual music festival.

Three incredible stages, two inspiring keynotes, seeing your superheroes up close and personal and making new connections, in a laid-back and friendly scenery, who said learning can’t be fun?

The Code Whisperer, Diaspar Software Services, Inc.

Consultant, programmer, technologist, Curbralan

Tech Consultant

Hands-On Software Architect, Independent Consultant, Author

Software Architect & Meme Wrangler, ThoughtWorks

Award-winning author, founder of Agile Developer, Inc.

Technical Director, Thoughtworks

Chief Artificial Intelligence Officer

Data Engineer, Tremend by Publicis Sapient

Technical Designer, VOIS

Senior Data Engineer, E.ON Software Development

Data Scientist, Strongbytes

Leadership Consultant, Introspecials

XR Creative Developer, Colorful Coding

The speakers

Meet the superheroes that changed the game in software development.

Yeap, they’re all coming to Romania! Grab a coffee with them and prepare to be starstruck.

The stages

Woodstock

Factory

Portal

Holiday Village

Masterclasses

These high-end workshops allow you to dive deeper into specific topics related to software development. The masterclasses are taught by experts in the field and offer a more personalized and interactive learning experience. You get to work closely with the instructor and other colleagues in a small-group setting and ask questions and get feedback in real time. Overall, they are a unique and valuable opportunity for anyone looking to expand their knowledge and expertise in software development and IT.

doors open in

Days
Hours
Minutes
Seconds
Secure your place and pre register now

Get the Codecamp app

]]>
Codecamp_Festival 2024 https://codecamp.ro/codecamp-festival-2024/ Tue, 02 May 2023 09:28:24 +0000 https://codecamp.ro/?p=18241

Codecamp_Festival

The Saga Continues... in Iasi

24 October 2024 _ Agora Center Iasi, Romania

A complete experience

16 superheroes

2 top-notch keynotes

3 stages

New connections

Food and drinks

Concert & afterparty

Codecamp_Festival is a one-of-a-kind experience, mixing learning from the best speakers out there, from all over the world, with the glitz and glamour of an actual music festival.

Three incredible stages, two inspiring keynotes, seeing your superheroes up close and personal and making new connections, in a laid-back and friendly scenery, who said learning can’t be fun?

The Code Whisperer, Diaspar Software Services, Inc.

Consultant, programmer, technologist, Curbralan

Tech Consultant

Hands-On Software Architect, Independent Consultant, Author

Software Architect & Meme Wrangler, ThoughtWorks

Award-winning author, founder of Agile Developer, Inc.

Technical Director, Thoughtworks

Chief Artificial Intelligence Officer

Data Engineer, Tremend by Publicis Sapient

Technical Designer, VOIS

Senior Data Engineer, E.ON Software Development

Data Scientist, Strongbytes

Leadership Consultant, Introspecials

XR Creative Developer, Colorful Coding

The speakers

Meet the superheroes that changed the game in software development.

Yeap, they’re all coming to Romania! Grab a coffee with them and prepare to be starstruck.

The stages

Woodstock

Factory

Portal

Holiday Village

Masterclasses

These high-end workshops allow you to dive deeper into specific topics related to software development. The masterclasses are taught by experts in the field and offer a more personalized and interactive learning experience. You get to work closely with the instructor and other colleagues in a small-group setting and ask questions and get feedback in real time. Overall, they are a unique and valuable opportunity for anyone looking to expand their knowledge and expertise in software development and IT.

doors open in

Days
Hours
Minutes
Seconds
Secure your place and pre register now

Get the Codecamp app

]]>
From software to systems: skills we need now https://codecamp.ro/from-software-to-systems-skills-we-need-now/ https://codecamp.ro/from-software-to-systems-skills-we-need-now/#respond Fri, 06 Jan 2023 07:55:22 +0000 https://codecamp.ro/?p=16636

If you’ve read The Economist, donated to Wikipedia, or contributed to The World Monuments Fund, you’ve interacted with systems that Diana Montalion helped to architect. She was also a speaker at Codecamp_Festival last year, where she talked about the skills we need now in architecture. 

If you’ve missed Diana’s talk last year, have no fear! She will also be joining us in 2023. If you’re still on the fence, have a look at her take on From software to systems: skills we need now.

The skills we’re going to cover are tech agnostic, it’s not about Kafka, or Kubernetes, or Terraform. It’s the kind of skills that you need regardless of what the programming language is. 

I called this talk From software to systems, but those things mean a lot of different things. How do we define software and how do we define a system? 

I started my career as a software engineer, as a back-end developer or a full stack developer, if you remember when full stack was actually possible to be. I mostly worked on big websites with a lot of traffic and back then, we used a single piece of software and wrote a lot of code. We extended and extended and to make it performant, we added a lot of caching. The software itself created the boundary of space-time, so we created a digital space. There were lots of discussions about aggregating information versus encouraging traffic and encouraging traffic always won. At the time, you wanted everyone to come over to your house.

And time was requested, there would be a request for a piece of information and the software would provide it. Every one of these pieces of software was part of an emerging information system. The internet is THE information system. It’s a giant knowledge graph and then it’s expanded to be beyond even what we would consider the boundaries of the internet to be. Soon, my clients were quickly outgrowing pretty much everything we knew to do.

One example is The Economist. Way back when, my teammates and I built a web property so that what was in The Economist magazine, could now be on The Economist website or The Economist Digital. And within six years or so, one print article had about 40+  destinations and not only that. They were making films and podcasts, they were having different types of media and there was no infrastructure to support this. The first thing I did when I came back again to do systems architecture for them, was that I tried to draw a model of the current system and I discovered two things. One, that nobody actually knew what was going on, because it was all stuck together, siloed, and two, my model had a box in the middle with the word Suzanne in it. And that’s because Suzanne literally cut and pasted things. That’s how things got distributed.

More recently, I have been working with the Wikimedia Foundation. This to me, is an iconic example. Wikipedia is built and designed around a single piece of Wiki Software. The original concept is that the Albert Einstein info is in a web page, it’s an HTML webpage. But now, we think of that content as ubiquitous. We want to ask our smart devices questions and get the information. To make that transition, there are a lot of unique challenges, but one of them is that the community also works on the software too. So the boundaries even between information and software are very blurred.

So, fundamentally the last eight years of my career have been spent restructuring space-time. A space is no longer defined by a piece of software and time is no longer defined by a page request. We’ve been building asynchronous software, microservices, where we don’t transform the legacy software, we create abstraction, we start to figure out ways to iteratively move into the infrastructure that we need. We’ve been building event-based interactions, cloud-native platforms that talk to other cloud-native platforms and hypermedia data structures, all these things.

My focus shifted to the relationships between software. It is less about how I do this in a piece of software and more about what are the relationships between software and the patterns that we need, in order to make those relationships healthy and emergent.

So I became an enterprise software architect, in part because I love it, I really love the pattern stuff, the pattern is what gets me up in the morning. But also, because it was a survival choice. We weren’t going to be able to do what we needed to do, unless we thought differently. I’ve been part of some complex transformations over time, and what I can tell you, is that almost every initiative hits the exact same iceberg. That iceberg is almost never the lack of Kubernetes experts, that’s not what sinks the ship. What does sink the ship is that we don’t think in systems.

The term, software crisis, came out 50 years ago and we still haven’t resolved it. As complexity increases, our thinking and communication structures do not scale with it, and so, we end up trying to do something different inside of our old mental models. And more than that, we don’t think together in systems. Organizations are a communication structure, they’re a thinking structure that dictates how we think and communicate and so, if the organizational structure tends not to change, that means that the structure of our thinking and communication doesn’t change, which leads to us not being able to build something different.

What do I mean by thinking in systems? To explain that, I’m going to talk about linear thinking, which is what we don’t want. Most of us don’t think of linear thinking as linear thinking. When we say the word thinking, this is what comes to mind, linear thinking. It’s what we’re taught in school and it also is the structure of education. We are so surrounded by linear thinking, that it is in the vast majority of cases the default. That is not a bad thing, because we need linear thinking to build, design, deploy and develop software. But different types of thinking go together to create what we need to do and we tend to lean very heavily toward linear thinking. 

Linear thinking is when we want things to be predictable, rational, repeatable, top-down, dualistic and concerned with control. The mechanisms are created in order to create control, but they don’t help us design systems, they don’t help us resolve challenges when there’s uncertainty and complexity. We also expect predictable, top-down, rational from our socio-technical systems, we expect people to behave this way and communicate this way.

Non-linear thinking means many things: systems thinking, parallel thinking, there’s so much overlap in how people are trying to describe it, that I’ve defaulted to the term non-linear thinking The thing that I most want if there’s only one idea that you’ll remember after this, is that non-linear thinking is a practice and the better you get at it the more complexity you’re going to want to take on and then you’re going to have to practice more. So if you’re lucky, you actually never arrive at expertise because you’re always increasing your capability and your capacity to solve problems without over-reliance on linear approaches.

Non-linear thinking is making sound decisions, while happily immersed in complexity and uncertainty. Non-linear thinking is concerned with how relationships produce effect. When you have this and you have that, and you put them together to get a third thing, that neither of those two could have done on their own, it’s a real challenge in the transition from software to systems, where you have this and that and there’s not a lot of attention put on the and part. We’re not good at the relationship between the parts.

Systems are counter-intuitive, so when you’re solving a problem outside of the linear construct, what you’ll discover is that, what we think we know, is almost always incorrect, it’s not going to serve us. Often, when you go into an organization and do an analysis and you’re looking for the leverage point, the place in the system where no one is paying attention to symptoms, you actually can make a change, and unlock the capability or improve the health of the system. It’s hard to find that leverage point, and often when you find it, people already know about it, that’s the pain point. But they’re almost always doing the exact wrong thing, pushing it in the exact wrong direction and that’s because of counter-intuitiveness. Even when you do find the leverage point, almost nobody will believe you. In my experience, it can often take a year of talking about ways that we might transform before I start getting emails back that have my suggestions in them.

It’s a process that requires a lot of internal integrity, which I didn’t need when my focus was exclusively on software. The feedback loop in software development is so much shorter. 

The structure of communication in an organization is the system that they’ll design. Show me a code base, and I can tell you a lot about the team that wrote it, and how they are working. You can see it in the outcome. And this makes sense because what we think and what we think together and talk about, is precisely what we’ll build. It doesn’t come from anywhere else. Everything that’s in code is just thoughts and discussions. So if we want to build something different, we would have to change the structure of our thinking and communication.

The challenge in doing that is that we have two blockers. And they’re pretty big blockers. The first is that we are spectacularly terrible at non-linear thinking. We are so tangled in our cognitive biases and logical fallacies and we really have to practice to be untangled. The second blocker is that we don’t know that we’re spectacularly terrible. As a matter of fact, the worse we are at non-linear thinking, the more we’re sure we’re excellent. And here’s the paradox: in order to know that you’re not doing well in non-linear thinking, you have to actually be good at non-linear thinking, to see it. 

So, in the fullness of systems, we are open to and embrace skills that we call soft skills. I’m going to talk about six skills, but these are really doorways. Pick any doorway that interests you or any combination of doorways like it’s a buffet. They really all go together, not really inseparable, so it doesn’t matter where you start.

  1. Craft conceptual integrity – this is actually more of an intention than a skill. It’s kind of a North Star and it’s a good mantra to have. Fred Brooks says it’s the most important consideration in systems design. He also doesn’t do a great job of defining it and it’s really hard to define because it’s like art. You sort of know it when you experience it, or you know it when it’s missing. The way I like to describe it though is creating harmony from a cacophony of many good but independent and uncoordinated ideas. I have three suggestions of practices that can help raise your sensitivity to whether or not conceptual integrity is something that’s part of what you’re trying to do. The first is to think cross-functionally. What’s the impact, the relationships and other perspectives? What is the why of what you’re doing and try thinking outside the boundary of the engineer experience? The second is learning about nonTech systems. There are some examples of books about actual building architecture that help you think about components and spaces, but not in terms of microservices, in terms of literal space. It helps create a language for talking about system patterns. The third is to study relevant-to-you patterns. Every time we go and learn about the patterns that are specific to us is a real benefit to our being able to discern when we’re engaging in systems talk.
  2. Cultivate self-awareness –  you can’t improve your thinking and experience if you’re not aware of your thinking and experience. The ability to work with our own minds is an essential tool for what we do. In order to create conceptual integrity in the world, we have to create conceptual integrity in ourselves. It can be very confusing to be interacting with everybody’s thoughts and opinions all the time and still hear your own in the cacophony of many good but uncoordinated ideas. What we think is what we’ll communicate and then what we communicate is what we build. Some examples of skills that come in handy in this area are journaling and meditation, and I know it sounds weird, but for me, they really help me to stay aware of what I’m thinking and about all the things that I’m experiencing. The other thing is that these practices help you hear your intuition and sometimes you can just have a sense of something that is wrong but the cognitive understanding doesn’t come until later.
  3. Respond rather than react – people usually panic. They overreact from their own perspective. If there is no communication between people, and no information shared between them, the whole system falls apart, whereas, if there was a systems view of what is happening, we could overcome this. There’s a lot of blame on systems. Remember counter-intuitiveness? What we’re blaming is almost always wrong.  When you’re reacting, when you’re in a meeting and someone says something really stupid that really gets on your nerves, the worst thing you can do is react. Because you will almost always push it in the wrong direction. Rather than reacting to confusion around you or what’s happening in the system or how to focus on solving a problem, maybe you can go for a walk or go for a run. The pattern where you can’t think your way out of reacting results in just adding more on top of your reaction. And then, suddenly you have this major drama. Dropping out of that pattern with experience is the first step to not reacting and enabling your ability to respond. The second skill I would recommend is saying “yes, and”. This is an improv practice, so when improvisational comedians go on stage, they will always use the  “yes, and” exercise. If I say no, then the whole scene falls apart. It just does not work. I’m not agreeing, I’m acknowledging. And if we acknowledged what other people said before we tell them they were wrong, we would find solutions faster. It can be a lot harder than it sounds, but the results will be something else. And the last skill here is to try something. Doubt is the experience of uncertainty and doubt only changes when you have a different experience, so try something. When you’re really stuck, it often means that you actually need some experience in order to continue having the conversation. Do different things at once and eventually, it will help you to discern where you want to go.
  4. Build systematic reasoning – respond rather than react. Responding is work, argumentation. We are an opinion-sharing culture. You post something in a forum and then everybody gives you their opinion and somehow you’re supposed to make some integrated sense out of that. I don’t find opinions very productive, but also, opinions are not how we’re contributing value. It’s great to have them, but that’s actually not knowledge work. The real, deeper work comes from using the ability to respond, the ability to arrive at the best possible conclusion, under the circumstances, when conditions are uncertain. Using this as a method of inquiry, build your response. So every time you leave a meeting reacting, the next step is establishing how to build a response to what it is that I’m hearing. Conditions and systems are always uncertain. You put a relationship between three things together, and you put them in the world and then you get something you did not design. That might be a really good thing, innovation. It might be hacking Facebook as a part of an election cycle. Systems will surprise you, that is pretty much a given. You can build systemic reasoning in a very straightforward way. Whenever you make a claim, give three to five reasons that convinced you. Show me what your reasons are and then strengthen them, to get cohesion. If you don’t have cohesion like you think you do,  and you built it into the system, what would happen?
  5. Make Art(ifacts) – write it down, model things together anytime that you’re stuck on something. Keep the why connected to the what. Make sure everybody is sharing that same understanding. Create layers in your artefact so that people that need different information can get that. Your architecture is a knowledge graph, so make it like an interconnected knowledge graph. Explore frameworks that describe the system. How do you communicate your system, how do you organize artefacts so that it communicates the system as opposed to how you develop in your local environment?
  6. Synthesize –  synthesize knowledge, experience and good judgment, into decisions based on valid reasons. Not your own knowledge and experience exclusively, because systems are complicated. Synthesize expertise, synthesize experience and use sound judgment in order to come to decisions. 

Watch Diana’s talk here

]]>
https://codecamp.ro/from-software-to-systems-skills-we-need-now/feed/ 0
Code Red: the business impact of code quality https://codecamp.ro/code-red-the-business-impact-of-code-quality/ https://codecamp.ro/code-red-the-business-impact-of-code-quality/#respond Mon, 19 Dec 2022 14:23:06 +0000 https://codecamp.ro/?p=16519

It was a pleasure to have Adam Tornhill at Codecamp_Festival this spring! Adam is a programmer who combines degrees in engineering and psychology. He’s the founder & CTO of CodeScene where he designs tools for building great software. He’s also the author of Software Design X-Rays, the best-selling Your Code as a Crime Scene, Lisp for the Web and Patterns in C.

At Codecamp_Festival, Adam talked about the business impact of code quality, and here is a glimpse of his talk: Code Red: the business impact of code quality


Somewhere between 23-42% of a developer’s time is wasted dealing with the consequences of technical debt or bad code in general. What that means to me, as a business manager, is that if I have 100 developers in my organization, 42 are non-productive. I’m getting the equivalent output of just 58 people. And in reality, the waste is even larger, and to understand this better, we need to talk about teamwork. Most software developers are part of teams and have been part of a team-building exercise. We have all done this. We all know the benefits of team building, we know the benefits of being on a team.


I am going to talk about something different, more like an anti-team building exercise, because like all great things, there’s also a trade-off. Nothing is ever free, and it’s the same for teamwork. It always comes with a cost and that cost is something that social psychologists refer to as process loss. 


Process loss is a term that social psychologists have stolen from the field of mechanics. The idea behind it is that just like a machine cannot operate at 100% efficiency all the time due to things like friction and heat loss, neither can a team. Let’s say, we have a number of individuals together, and they have a certain potential productivity. However, the actual productivity we get is always smaller and part of the potential is simply lost.


The type of loss depends on the task that we do but for complex interdependent tasks, like software development, a big part of that process loss is simply due to coordination and communication overhead. And what that means in the context of technical debt is that you waste 42% of developers’ time and we can never make up for that. We can never compensate for that by hiring even more people, because the process loss increases non-linearly, so at some point, each individual that we add is actually going to cost us more. The more we can do with a smaller team, the better we are.


So, we simply need to start managing technical depth. Given what I explained about process loss and given the fact that there’s a global shortage of software developers, does it make sense that we waste 42% of developers’ time?


You would expect technical debt to be really high on any decision-maker’s agenda, which of course, it never is in reality, because the research constantly finds that many businesses keep forcing developers to take new technical depth, as they hunt for the next feature that they need to deliver.


So, why is this happening? Why aren’t we doing a better job at managing technical debt?


I think I know why, and I would like to explain why that happens. We need to look at some laws of software evolution and at what happens when we build code.


The first law of software evolution is
the law of continuing change, and the law of continuous change simply says that the system has to continuously evolve and adapt or it will become progressively less useful over time. This is the very reason why we keep getting new features to existing products. Because a successful product is never done.


What needs to be noticed is that there is some tension, some conflict, to the second law of software evolution and that’s
the law of increasing complexity. And this law says that when we evolve our systems, their complexity will increase unless we actively try to reduce it.


So that’s what’s happening when we take on technical depth. The complexity increases, which in turn, makes it harder and harder to respond to change. If we take an outside perspective and look at these two laws together, we will see that there’s a difference in feedback timing. When we release a new feature, we get very quick and immediate feedback, the moment we put it in the hands of a user. Whereas, for increasing complexity, the feedback timing is much longer. This is something that happens over time and this difference in feedback timing is like an open invitation to something that psychologists know as a decision-making bias of
hyperbolic discounting.


Hyperbolic discounting is a decision-making bias where our current self makes decisions that our future self is going to regret. Hyperbolic discounting is frequently used in the psychology of addiction to explain substance abuse and addiction. It’s also, coincidentally, the best description of why companies fail to manage technical debt. Because companies, just like the addict, are lured in by the promise of the next quick fix, the next immediate reward. Delivering and pushing those features that seem urgent out, is done at the expense of long-term well-being, which in terms of software, means a maintainable and sustainable code base.


To fight hyperbolic discounting it’s really important to visualize the potential consequences because if we can visualize them, we can convince decision-makers to start thinking about the future, which makes it much more likely that they will actually act now.


How can we visualize accidental code complexity and technical debt? Software kind of lacks visibility. When talking about complicated code, we have to understand that it’s really hard to measure the complexity. If we look for a single number, a single metric to capture a multifaceted concept like code quality or code complexity, then we are doomed. Software is just way too complicated.


The most promising approach is to identify specific attributes of complexity and measure them separately. I’ve been calling this concept code health. We define properties, that we know from research, that lead to increased maintenance costs. In the current code health concept, I have 25 different factors to measure. We measure them separately, we aggregate them, we normalize them and we can then categorize every single piece of code in a system as being in one of three different categories:

  • Green code – perfectly healthy code, no code smells, no particular complexion issues;

  • Yellow code – Increased maintenance code, this is where we have technical depth

  • Red code – here is where we have high maintenance code, that is disastrous to business


To give you an idea of what we measure in a code of concept, we look at typical
module levels, things like:

  • low cohesion –  when you have a module and it includes way too many responsibilities. We have put too many features into that module and that in turn, makes the code very hard to understand and it also puts you at risk for things like unexpected feature interaction; 

  • brain classes – a module with low cohesion that also contains a brain method.

 

On the function levels, we look at:

  • brain methods –  typically very large functions that are overly complicated, that have lots of conditional logic and that tend to be very central to the module, meaning that each time you go into the code to make a change to that module, you end up in the brain method and they typically grow more complicated over time

  • copy-pasted logic 


On the
implementation levels, we have:

  • deeply nested logic – when you have an if statement, then you have another if statement, deciding another if statement and then, maybe a for loop for good measure, so your code looks kind of like an arrow. The reason why this is problematic is that it puts a huge load on our cognitive memory

  • primitive obsession – missing a domain language 


Next, we need to understand if the code health categories actually mean something from a business perspective, because without the business connection, all of these are just vanity metrics.


So, we tried to quantify the business impact of complex code. We collected data from 39 commercial code bases, real-world code bases under active development at 39 different companies, data analytics, infrastructure, networking, and all kinds of domains because we wanted to make sure that whatever we find, we would be able to generalize across businesses.

And for the same reason, we included code in 14 different program languages, to make sure that our findings weren’t specific to a certain language. 


What we decided to do, was to measure the
time in development: does it take longer to develop a feature in red code versus green code? The main problem with that is that no organization actually knows its development costs. They don’t know how much time they spend on development. And this sounds like a really strange statement. As managers, we know what our staffing costs are: we know we have 10 developers, and the salaries we pay them.


With some Jira magic, we could figure out roughly how those costs are distributed across different Jira tickets, so I could kind of calculate that we spent these many hours on this particular feature. Previously, we had no way of knowing how those costs are distributed across potentially thousands of modules in a code base of various qualities. We never had that level of detail. So this was the first challenge that we needed to attack, and we did that by using the following algorithm: 


We pieced together data from Jira and Git, so, for every single feature, every single Jira card, we start the clock for time and development the moment we, as a developer, pull a card to an in-progress state. When we make a commitment, we pause the clock. If the feature is done at this stage, then the cycle time between ticket movement in progress until the first commit is the time and development for that Jira card.


But sometimes, we do multiple commits and if that happens, then we calculate the cycle time from the previous commit to the next commit. And we might even do a third commit. In the end, we simply sum up these different subcycle times so we get a total time and development per file per Jira.


Now, we had a data set that included the code health for every single file, the time and development for every single file and since we’re using Jira, we could also figure out how many bugs fixes we have done in each one of the files so we can finally answer the question:
does code quality matter?


And this is a question I wanted to answer for decades, because I’ve spent 25 years in the software industry, and during those 25 years I have more or less learned that everyone knows that code quality is important yet no one ever had any data to support that statement.


The average time in development, depending on code quality can vary immensely. If I implement a feature or fix a bug in red code then that takes more than twice as long as making a change to green code. To a decision maker, what this means is that if it took my team two and a half weeks to implement a specific feature, and our code is red, then our competitors, that have a green code base, could get the same feature in less than one week.  


But I have to admit that this result didn’t really surprise me, because this was pretty much what I would have expected, given my years in software but what did surprise me was the next research question that we looked into.

We wanted to look into something that we call the uncertainty completion time for different features and what we did differently here, is that instead of calculating the average time spent in development, we looked at the maximum time and development for every single file. What these results show is that green code seems to be very predictable, in the sense that the maximum time it takes to implement a feature is very close to the meantime, meaning there is low variability in green code. I will know roughly how long it takes to make a change to the green code. For red code, that relationship is no longer true, because in red code the maximum time it can take you to implement a feature can be an order of magnitude larger. In terms of business, this means uncertainty. I’m currently working as a CTO and I have to admit that as a CTO I strongly dislike uncertainty because it makes me look bad. For example, let’s say that I promise you that we’re going to have this new feature in a month but our code is red so it actually takes nine months to implement that feature. You are not going to be pleased.


In the last data set, we also looked at the correctness perspective. We looked at the distribution of bugs or defects across code of various qualities and what we see here is that the red code has on average, 15 times more defects than the green code. This is important because this pretty much comes down to customer satisfaction and the product maturity experience.

It is easy to see how all this data relates to the business side of software, and how it’s important to a business or technical manager but is it important to us as developers?  After all, you could say that if a business chooses to waste 42% of its time on technical debt, then maybe that’s a good thing for us because it means that we will be even more in demand. That’s job security at its finest. We can even get higher salaries. No, trust me on this one, technical depth is not good for you.


There’s one study in particular that looked at the happiness of developers. And yes, it is actually possible to measure that. There’s a standardized scale within psychology that you can use and you can get some very accurate numbers. They studied 1300 developers and more specifically, they looked at what makes a developer unhappy and an unhappy developer is also a developer that has lower productivity, so this is important both for well-being as well as the financial aspect.


There were three things that stood out in particular:

  • The first was that developers dislike it when they get stuck in problem-solving. Like when you have a bug and you think that you can fix it in five minutes, then you dive into the code and you start to fix it and something else breaks and you try to fix that and something else breaks and you end up spending two weeks trying to fix that bug. That’s extremely frustrating, and that’s where we’re likely to be with red code because remember, red code had that extreme unpredictability

  • The second is time pressure, because if we think something takes one week and it ends up taking nine weeks then of course the whole organization is going to get under time pressure

  • The third is that developers suffer tremendously when they encounter bad code that could have been avoided in the first place and that’s kind of the textbook definition of technical depth.


Given all this data that we have seen on the costs of code quality and the business impact, how do we use it and how do we integrate it into our daily work? There are a number of things I have seen that work really well. One of them is that, if we know the code quality of every single piece of code that we have, then we can also make sure that all stakeholders, not only we, developers, but also our managers and the product owners have a shared understanding. Because once everyone has a shared understanding then it becomes possible to fight decision-making biases like hyperbolic discounting. We can actually build a business case for larger improvements and logical refactorings. If we were to work with a certain part of the code, and it is red, it means a lot of uncertainty, the development would take longer, and there will be a higher risk for bugs but if we refactor it to become green, we know that we’re very likely to be at least twice as quick the next time we need to implement a feature there. So it’s one way for us to let the business people peek into our otherwise inaccessible world of code and code quality.


For more case studies and explanations, be sure to watch Adam’s presentation, on our YouTube Channel. 

]]>
https://codecamp.ro/code-red-the-business-impact-of-code-quality/feed/ 0
Take five – A countdown of what’s essential in software development https://codecamp.ro/take-five-a-countdown-of-whats-essential-in-software-development/ https://codecamp.ro/take-five-a-countdown-of-whats-essential-in-software-development/#respond Thu, 15 Dec 2022 11:32:13 +0000 https://codecamp.ro/?p=16477

This spring, at the first edition of Codecamp_Festival, we had the pleasure of having Kevlin Henney with us. You may know him as the co-author of A Pattern Language for Distributed Computing and On Patterns and Pattern Languages and editor of 97 Things Every Programmer Should Know and 97 Things Every Java Programmer Should Know, but in this keynote, he talked about his take on what’s essential in software development.

So, without further ado, let’s jump into Kevlin’s countdown:

 

5. Five orders of ignorance

What is learning? Learning is knowledge acquisition, it’s knowledge communication. There is something that we do in software development that gets classified as knowledge work. It might sound crazy at first, but, at a deeper level it is true that that is what you’re doing in a code base. Quite literally, a code base is a codification of knowledge, it is a codification of the knowledge of the understanding of the domain, of the problem and of the solution and how we can bring the two together. You are constantly learning and you’re constantly trying to communicate through the code and this is done collaboratively, as a team. 

In other words, a code base is effectively a collaborative knowledge exercise. So this takes us in a very different direction, thinking about code as just being about solving business problems or code as a kind of a product. It is in fact a collaborative knowledge exercise. Grace Hopper said that programming is more than an important practical art. It is also a gigantic undertaking in the foundations of knowledge, similar to applied philosophy. So if you’re looking for something extra to put on your business card and you’re thinking software engineer or full stack developer is a bit boring, applied philosopher is way cooler.

The five orders of ignorance, written by Philip Armour present an interesting way of thinking about what it is that we do, organizing our knowledge into different zones and classifying the nature of what we know:

      • lack of ignorance or the known knowns

      • lack of knowledge or the known unknowns

      • lack of awareness or the unknown unknowns

      • lack of process or the unknowable unknowns

      • meta ignorance

    Meta ignorance basically means you don’t know about the five orders of ignorance but we are already solving that problem as we speak.

    The known knowns are what you know and you can demonstrate. It is a very simple statement. It can be very much like knowing a programming language to a level of competence, or a library, or a domain.

    The known unknowns are like how you know you can’t speak a certain foreign language. There are things that we don’t know and we know that there are boundaries. Now, the interesting thing is, we already have a bias at this level, but this is the level we’re comfortable estimating at. We’re kind of comfortable estimating some of the things that we know we don’t know, but we make them a little less important because, if they were important we would already know them.But at least, you’ve acknowledged that you know that you don’t know something, that there will be work that you have to do to achieve that knowledge. 

    The problem is that most software development does not happen in zero and one. It doesn’t happen just with the known knowns and the known unknowns. This is where we walk into the unknown unknowns. You did not know that you did not know. How do you plan for that?

    What we can do is increase the probability that we will discover the unknown unknowns.

    This is where things like bugs live. This is where assumptions live. This is where you thought you knew something and then, one day you wake up and realize you were wrong. 

    Let’s get back to bugs because they will affect a development process. Whether they are

    small bugs or larger issues of development, they are very difficult to anticipate. It is like somebody today asks you how long is it going to take you to fix the bugs that you’ve put in the code next month. The whole point about this level of knowledge is that it’s surprising even when you’re expecting it. Assumptions are very curious pieces of knowledge because they are discovered mostly by contradiction. Normally you discover you have an assumption when it’s wrong. You don’t really discover it when it’s right.

    The last one, the unknowable unknowns: it means there is nothing that you can do to find out something before it happens, before it can be known.There is no amount of testing or code review that can be done to discover something sooner. How on earth are we supposed to

    anticipate the future? Humans struggle with the future that is why we have come up with ideas like road maps. It is a very popular business metaphor and it’s found its way into software development also. We have product road maps, architecture road maps. They are a great idea but you need to understand what a roadmap is, because people are using it wrong. Simply because in practice there is more than one road. Why would you have a road map with only one road? What is the point of a road map with only one road? That’s just an itinerary.

    The whole point about the future is that there are many roads. What you need to show people is this is our current thinking, based on our existing assumptions, we’re going to take this path but you know there’s another path here and there’s another possibility. 

    This also has important implications for the way we prioritize requirements. There is this mantra in the agile community, to prioritize by business value. I have some very bad news for you, it can’t be done. You do not know the business value of something, until it has been built and shipped and used. If you knew the business value of something in advance, that would completely transform the nature of markets over the planet. The future is not knowable before it happens. You cannot prioritize by business value because it violates the laws of physics. You can prioritize by estimated business value, but that’s different. Never confuse an actual with an estimate.

    So, in conclusion, what we find out from the five orders of ignorance is that we demand and we’ve been given rigidly defined areas of doubt and uncertainty. These are embedded into the fabric of computer science.There are formally undecidable things, there are things that cannot be determined.

     

    4. The PDSA Cycle

    First off, I’m not going to say you must follow this cycle religiously. 

    As Andy Kinslow pointed out, the design process is an iterative one. It’s a learning cycle. You don’t learn all at once. You are gathering your knowledge through a cycle of expectation and experimentation.

    So, the PDSA cycle has four stages:

        • Plan: here’s the thing we’re going to do, the thing we want to explore, a hypothesis or set of hypotheses that we want to examine. That’s what we’re doing every time we build a piece of software, or we want to make it faster, or optimize it. 

        • Do: the problem is historically a lot of plan driven approaches have stopped here. We do a lot of planning and then we do an awful lot of doing, but there’s no cycle

        • Study: We should take the feedback. Learning involves a corrective cycle, it involves reflection study

        • Act: and then comes the response: here’s what we’re going to do based on what we now know

      Now, you may find there are variations of this and you shouldn’t make them rigid. You can do these concurrently, they blur together, but all four of these activities should be present.

      What’s difficult is that the Act and Study parts of the diagram are hard to see. It’s very easy for you to see when people are doing planning, planning has an output. Whether we talk about

      a plan for how we’re going to build something or a plan in time of who’s going to do what. And you can definitely see a result of doing. But what is the result of studying and acting?

      It’s almost invisible, yet so important. It doesn’t have immediate consequences, it has long term

      consequences which is why the last two parts of the cycle often get ignored. You learn by finishing things, so this is how you increase the probability that you will find the unknown unknowns.

       

      3. The three questions of Architecture

      There’s a lot of different ideas about what we mean by architecture and Martin Fowler captured this quite nicely by saying it’s a term that lots of people try to define with little agreement. 

      We don’t have a true definition, but Martin observed that architecture has two common elements: One is the highest-level breakdown of a system into its parts, the other, decisions that are hard or expensive to change. 

      I don’t generally go for the first one, as people will often put up a powerpoint diagram and say this is our architecture. The one thing I can guarantee is that if somebody puts up a diagram and says this is our architecture, then it is not their architecture. It is a view of their architecture, a representation of their architecture but it is not the architecture. It normally involves a bunch of boxes with relationships, it often misses out things like time, it misses out smaller details that are actually going to determine how the system fits together. 

      The three questions of Architecture are from a book by Paul Dyson and Andy Longshore and they offer this simple idea that an architectural definition is something that answers three questions:

          • What are the structural elements of the system? 

          • How are they related?

          • What are the underlying principles and rationale that guide the answers to the previous two questions?

         

        2. The two questions of quality

        How do we know that something is good? That depends on the nature of the thing. If it’s food,

        then we have a very specific way of describing what we personally, individually find as good. 

        But if we are dealing with a software structure, we often talk in terms of problems and how to solve it.

        The book I got the two questions from is Times we’re building by the late Christopher Alexander. In it, he originated the idea of patterns that eventually made their way into software. The book was actually about buildings but he defined some really interesting ideas about patterns.

        We know that every pattern is an instruction of the general form:

        Context → Conflicting forces → Configuration

        If we’re dealing with code, it might be you’re working in a particular programming language and there are lots of threads. You’re working in Java, it’s a multi-threaded code base, all of the code is in a single executable. That context is very different to when we are running a JVM system where there are multiple languages in use, executing in different processes and we are using HTTP to connect things with a whole load of JSON thrown between them. Both of these are statements of context as well as statements of connection and composition.

        Moving on to conflicting forces, it relates to what it is that makes the problem you’re experiencing a problem.What is the difficulty that you’re having.

        And then configuration. Do not confuse that with the idea of configuring an application or the

        configuration file or anything like that. This means configuration as in what solution structure do you propose to solve the problem that you’ve got.

        Alexander said: We say that a pattern is good whenever we show that it meets the following two empirical conditions:

            • the problem is real

            • The configuration solves the problem

          This feels really obvious, painfully childishly obvious, which is why it’s so powerful. Because

          this is actually not really about patterns, it’s about design. It doesn’t matter whether it recurs, it doesn’t matter whether this is an idea that we can use elsewhere in different forms, it is an understanding of design. We are solving a problem in a particular situation and we have a particular solution. 

          The first question would be, is the problem real? Use this as a review question, because sometimes the answer might surprise you. For example, I asked a team I was consulting a few years back, why did they use XML in their project, and their answer was that they didn’t know..everybody else was using it. It was completely inappropriate for the class of software they were dealing with and just because everyone else was using XML and they hadn’t used XML yet, and wanted it on their CV, they ended up not solving a real problem. 

          We are very good at solving imaginary problems because software development is a creative profession, therefore we have great imaginations and the more creative you are, the more extra stuff you end up solving.

          The second question is, does our solution solve the problem? Again, that’s a really simple idea. You have to check if the solution you came up with actually fits the problem. Go Back to the PDSA Cycle. You’ve got to study and then adjust. If we proposed a solution, did it actually work? 

          Whenever you are making a decision about your practices, your designs, your code and you perceive there’s two different ways to go, ask the simple question: am I solving a real problem here, have I understood it well enough and does the thing that I am suggesting actually solve it.

           

          1. Have more than one idea

          Nothing is more dangerous than an idea when you have only one idea. This is not just good for software, this is actually quite a good way of looking at life. Sometimes we get really attached to

          a particular design approach and that becomes the only way we see the world.

          We need more than one idea to experiment. If you only have one idea, it’s a start, but you need to get to at least two and preferably three. Because then you can evaluate by comparison. You have different hypotheses to entertain. If you can think of only one way of doing something then maybe you haven’t understood the problem enough.

          So this this is a really important thing, even if you believe in a particular practice or coding approach very strongly, always take a step back and look for other approaches, see what else is available. 

           

          You can check out the entire presentation on our YouTube channel.

          ]]>
          https://codecamp.ro/take-five-a-countdown-of-whats-essential-in-software-development/feed/ 0
          Codecamp_Festival 2023 https://codecamp.ro/codecamp-festival-2023/ Mon, 10 Oct 2022 05:49:42 +0000 https://codecamp.ro/?p=16040

          Codecamp_Festival

          The saga continues... the superheroes are back!

          4 May 2023 _ Face Convention Center, Bucharest, Romania

          A complete experience

          16 superheroes

          3 top-notch keynotes

          4 stages

          New connections

          Food and drinks

          Concert & afterparty

          Codecamp_Festival is a one-of-a-kind experience, mixing learning from the best speakers out there, from all over the world, with the glitz and glamour of a true music festival.

          Four awesome stages, three inspiring keynotes, seeing your superheroes up close and personal and making new connections, in a laid back and friendly scenery, who said learning can’t be fun?

          The Code Whisperer, Diaspar Software Services, Inc.

          Consultant, programmer, technologist, Curbralan

          Tech Consultant

          Hands-On Software Architect, Independent Consultant, Author

          Software Architect & Meme Wrangler, ThoughtWorks

          Award-winning author, founder of Agile Developer, Inc.

          Technical Director, Thoughtworks

          Chief Artificial Intelligence Officer

          Data Engineer, Tremend by Publicis Sapient

          Technical Designer, VOIS

          Senior Data Engineer, E.ON Software Development

          Data Scientist, Strongbytes

          Leadership Consultant, Introspecials

          XR Creative Developer, Colorful Coding

          The speakers

          Meet the superheroes that changed the game in software development.

          Yeap, they’re all coming to Romania! Grab a coffee with them and prepare to be starstruck.

          The stages

          Woodstock

          Partner: Nagarro

          Factory

          Partner: Systematic

          Portal

          Partner: Morningstar Sustainalytics

          Holiday Village

          Designer: Luxoft

          Masterclasses

          These high-end workshops allow you to dive deeper into specific topics related to software development. The masterclasses are taught by experts in the field and offer a more personalized and interactive learning experience. You get to work closely with the instructor and other colleagues in a small-group setting and ask questions and get feedback in real time. Overall, they are a unique and valuable opportunity for anyone looking to expand their knowledge and expertise in software development and IT.

          doors open in

          Days
          Hours
          Minutes
          Seconds
          Secure your place and pre register now

          Get the Codecamp app

          ]]>
          Codecamp_Festival 2022 https://codecamp.ro/codecamp_festival-2022/ https://codecamp.ro/codecamp_festival-2022/#respond Mon, 30 May 2022 15:44:33 +0000 https://codecamp.ro/?p=15406

          Codecamp_Festival

          Meet all your superheroes in one day

          19 May 2022 _ Face Convention Center, Bucharest, Romania

          A complete experience

          19 superheroes

          3 top-notch keynotes

          4 stages

          New connections

          Food and drinks

          Concert & afterparty

          Codecamp_Festival is a one-of-a-kind experience, mixing learning from the best speakers out there, from all over the world, with the glitz and glamour of a true music festival.

          Four awesome stages, three inspiring keynotes, seeing your superheroes up close and personal and making new connections, in a laid back and friendly scenery, who said learning can’t be fun?

          The Code Whisperer, Diaspar Software Services, Inc.

          Consultant, programmer, technologist, Curbralan

          Tech Consultant

          Hands-On Software Architect, Independent Consultant, Author

          Software Architect & Meme Wrangler, ThoughtWorks

          Award-winning author, founder of Agile Developer, Inc.

          Technical Director, Thoughtworks

          Chief Artificial Intelligence Officer

          Data Engineer, Tremend by Publicis Sapient

          Technical Designer, VOIS

          Senior Data Engineer, E.ON Software Development

          Data Scientist, Strongbytes

          Leadership Consultant, Introspecials

          XR Creative Developer, Colorful Coding

          The speakers

          Meet the superheroes that changed the game in software development.

          Yeap, they’re all coming to Romania! Grab a coffee with them and prepare to be starstrucked.

          The stages

          Woodstock

          Partner: Thoughtworks

          Factory

          Partner: Systematic

          NDR Portal

          Partner: Sustainalytics

          Holiday Village

          Architect: Luxoft

          Agenda

          Coming soon

          Get the Codecamp app

          Masterclasses

          These high-end learning events feature top trainers and IT specialists from all over the world. The workshops represent an in-depth, hands-on, practical approach, addressing a diverse range of disciplines and technologies like architecture, Java, .NET.

          doors open in

          Days
          Hours
          Minutes
          Seconds
          Secure your place and pre register now

          Get the Codecamp app

          ]]>
          https://codecamp.ro/codecamp_festival-2022/feed/ 0
          Meet the superheroes: Grace Jansen https://codecamp.ro/meet-the-superheroes-grace-jansen/ https://codecamp.ro/meet-the-superheroes-grace-jansen/#respond Mon, 06 Dec 2021 14:04:19 +0000 https://codecamp.ro/?p=11646

          What does a biologist and a Developer Advocate at IBM have in common? The answer is Grace Jansen. Moving from biology to software engineering has given Grace a unique edge, using her knowledge of biological systems to simplify complex software patterns and architectures, making things seem easy.  

          Adding to her superhero traits, Grace has a keen passion for encouraging more women into STEM and especially Technology careers.

          You can meet Grace in person at Codecamp_Festival, on May 19th 2022, in Bucharest, but if you are curious about the human behind the superhero, check out this short interview and find out if you have similar tastes:

          Codecamp: What is your favourite book?
          Grace: Harry Potter

          Codecamp: Who are you looking forward to seeing at Codecamp_Festival, next year?
          Grace: Diana Montalion

          Codecamp: What is your favourite tech event? Besides Codecamp, of course.
          Grace: Devoxx

          Codecamp: Seeing as how you are one of our favourite Superheroes, who is yours?
          Grace: Black Widow.

          Codecamp: Where is your favourite place to take a break from it all?
          Grace: Lake Garda – great food, great scenery and so much to do!

          Codecamp: What is your favourite cocktail?
          Grace: Pina Colada

          Codecamp: What about music?
          Grace: Don’t have one – sorry!

          If you want to meet Grace and the rest of our amazing Superheroes in person, then Codecamp_Festival is the place for you! May 19th 2022, Face Convention Center, Bucharest.

          Get your Codecamp_Festival ticket here.

          ]]>
          https://codecamp.ro/meet-the-superheroes-grace-jansen/feed/ 0
          97 Things Every [Java] Programmer Should Know https://codecamp.ro/97-things-every-java-programmer-should-know/ https://codecamp.ro/97-things-every-java-programmer-should-know/#respond Mon, 22 Nov 2021 14:32:07 +0000 https://codecamp.ro/?p=11334

          On November 18th, we had the incredible opportunity to talk with Trisha Gee, Java Champion, and leader of the Java Developer Advocacy team at JetBrains, and Kevlin Henney, thought provoker at Curbralan, about the new book they edited, 97 Things Every [Java] Programmer Should Know.

          The book is made up of 97 chapters written by 73 contributors. And, although there are many more things a Java programmer should know, this book draws on some of those many perspectives to collect a cross-section and representation of the thinking in the Java-verse. 

           

          Here are some highlights of what went on:

          Codecamp: The book is a testimony of the fact that things get more complicated over time. When we started out, many years ago, people wiser than us told us that we should pay attention to two things: naming convention, cache invalidation, and off-by-one errors. Now there are 97 things we should pay attention to! What we like most about the book is the fact that one can open it randomly and get an interesting fact or learn something. That and the fact that most of the 97 things are written by past Codecamp speakers.

          That being said, our first question would be what is behind the title (97 Things Every [Java] Programmer Should Know):

          Kevlin: I’ll take this one, seeing as how I was there in the origin story, which happened in a land far far away from now, in the 2000’s. Bruce Eckel, who wrote Thinking in Java, ran this private chat for various people and we just used to have discussions there. And one of these people was Richard Monson-Haefel who asked Well, what are the things that a Software Architect should know because I’ve submitted this talk, called 10 Things a Software Architect Should know, and now I need 10 things! So, what are your suggestions? And he got a lot more than 10 suggestions. He said Well, this is really interesting, we could actually make a book out of this! He knew somebody at O’Reilly, but we needed a lot more than 10, about 100, but 100 is too obvious, and 101 and 99 are trying too hard not to be 100, and that is how we came up with 97. It has a nice feel to it. So, the first book was 97 things every Software Architect should know, then we had a series of books which I edited, and the whole series is named 97 Things. And then, we thought, let’s get language-specific, and that is how we ended up with 97 Things every Java programmer should know

           

          Codecamp: Let’s talk a bit about the first topic in the book: All you need is Java!

          Trisha: I thought this was an interesting approach because it was trying to get us to think less than all the libraries and frameworks and all the rest of it out there. We can do quite a lot with the Java libraries that come with just the JDK. A couple of years ago, when Java 9 came out, I tried to create a microservices application with just the JDK and no additional frameworks and libraries, and I did manage to do that. I don’t recommend it, because you have to hand-grow an awful lot of stuff which other people have done already. But there is a lot of stuff in just Java which gives it a lot of power and a lot of flexibility.

          Kevlin: Anders Noras wrote that piece and it is exactly like Trisha said. I think a lot of people, particularly as languages grow and this is not unique to the Java space, a lot of people will start a new development, not even asking the question of what we are trying to build, but by saying what technology stack we shall use. They bring in a lot more complexity than they need. You’d be surprised what you can do if you take it back a little. Sometimes people reach too quickly for dependencies when actually they already have what they need, either in the language or in the immediate realms of the JDK Libraries. Sometimes we forget what’s there.

           

          Codecamp: Let’s jump to number 54 in the book: Learn your IDE to reduce Cognitive load.

          Trisha: Just to set the scene, I do work for JetBrains, and I am a Developer Advocate for IntelliJ IDEA. So, I was thinking, how can I write something about how IDEs are amazing, without it being all marketing for IntelliJ IDEA specifically. So, I was thinking about why do I like to use IntelliJ IDEA as my IDE vs coding in any other way. Because I have used other IDEs, I have coded using compilers and such. So why is it that IntelliJ IDEA specifically helps me as a developer? And it is mostly because it stops me from having to think about other stuff. It reduces my cognitive load. Instead of me thinking what an if statement looks like, how do I type that, you just type it, or if, and IntelliJ IDEA just fills out with a live template, and it just writes half the code for you. A lot of people argue that that is lazy. Well, yes. But laziness is not necessarily a bad thing from a programmer’s point of view. You want the tools to do the boring, easy, lazy stuff so that you are thinking about what the business problem you want to solve is, what do you want to deliver, instead of thinking how do I write an if statement, how do I migrate this code from one thing to another, how do I extract a method. So instead of having to make all these steps, thinking about my lines of code, I just say to IntelliJ IDEA refactor this method and extract this thing, and run all my tests so that I can prove everything works and that’s it. So, by all means, think of IDEs as something that is going to make us lazier but that just frees up our minds to think about more valuable stuff for the business.

          There is a cost to it, because, in order to reduce your cognitive load, you have to invest time, to begin with, to learn these tools, and that’s why sometimes it is difficult to switch from tool to tool. And if you are going to switch languages, you might not have the time, or you might not feel like it is worth the time investment to learn the specifics of one tool for one language for one small project. So everything has costs and benefits.

           

          Codecamp: What about number 66? Program with GUTs. Kevlin, this is your right?

          Kevlin: Yes, this is mine. And GUTs is an abbreviation that Alistair Cockburn came up with a number of years ago: Good Unit Tests. These days we talk a lot about testing. We have done for a while now, the conversation has increased, I am fortunately or unfortunately old enough to remember when unit testing wasn’t really a thing that developers did. I am not saying that all developers now do it, sadly no testing is still the most popular testing technique, but in terms of number of developers that are much more focused and interested in their craft nowadays, the number is way higher. The discussion is if we have unit tests, that must be good automatically. Well, no, it is a bit like code. You can have code that works against you. You can have code with unmanaged technical debt. You can have the same experiences with tests. People often forget that we treat tests as second-class citizens because tests don’t go into production. But it is part of the pipeline, and somebody has to maintain it. And I’ve seen many cases where people’s hearts are in the right place, but it all comes back to this investment in technique as with anything. What makes a good unit test? What does a good unit test look like and what would you be comfortable maintaining? What would you be comfortable coming back to later? If something failed, what would you expect to see? It all comes down to whether you are just trying to test if the code works or are you showing me what you mean by the phrase “it works”. Because that’s the hard thing. Let’s say you join a new project tomorrow morning, you wouldn’t walk in there and go, hey does your code work? Normally your question would be What do you mean by it works. That is the hard bit. What does it actually mean? Sure, it goes green, but what does that actually mean? So good unit tests have a strong role in communicating meaning, they should be readable. Some of the things that make a good unit test readable are not the same as what makes production code readable, it has its own conventions.

          Trisha: I quite often look at unit tests when I first look at a code, especially when I don’t know what it does. I don’t look at the tests just to tell me it works. I look at the tests to sort of figure out the thought process of the developer is, particularly if it is logically related. I kind of expect the test names and the way they are set up to explain to me as a developer, why those choices were made when the production code was written. But, as you said in the article Kevlin, if you have something that says just Test 1, you can’t get much out of it.

          Kevlin: Yeah, I’ve seen those tests: Test 1, Test 2, Test 3…and I’ve asked those teams, well what does it mean when Test 3 fails, and they just shrug their shoulders. So, what does it mean when it passes? We are stuck with the same question. Testing should be an active communication. It is an act of explanation; you’re trying to get inside the mental model so that it tells you a little bit about the why. It is a really good way of showing how well your code is encapsulated. But unlike comments, they get executed. If it goes to green in one build, to red in another, you are moved to do something about it, whereas comments just disappear into the ether.

           

          We also addressed several other topics with Kevlin and Trisha, ranging from fundamental OOP principles that are sometimes ignored (Behaviour is “Easy”; State is Hard), what should go in a constructor (Minimal Constructors), up to Building Diverse Teams or Embracing SQL Thinking. If you want to find out more, watch the entire Codecamp_Talk on our YouTube Channel.

          And, if you are curious about all the 97 Things a Java programmer should know, you can order the book here.

          ]]>
          https://codecamp.ro/97-things-every-java-programmer-should-know/feed/ 0