Showing posts with label software. Show all posts
Showing posts with label software. Show all posts

Saturday, September 19, 2020

DDD The Lost Discipline

DDD is a modeling method highly focused on business domains and comunication. DDD solves several issues we have with Services/Microservices and Backend Systems in General.  One of the biggest challenges in Services but especially microservices is to find the right boundaries meaning what should belong to one service or what should belong to another service. It's common for engineers, often, just write code right and ignore the design. Modeling is hard for several reasons but one reason is the software might work, even with the wrong design. The right Design starts placing the code in the right place. DDD is key to that. DDD is not only about placing the code in the right place but also about how we communicate with the business to figure out that and other ways(DDD Patterns) to express the solutions.  

DDD is a nutshell 

DDD(Domain Driven Design) is about comunication. Comunication between the business and the business experts(not business proxies) and the engineers(the folks who build the solution). DDD's main interest is in the CORE Domain of the problem you want to solve. In order to explore the comunication between business experts and engineers, we should focus on a common language which for DDD is called "Ubiquitous language". DDD Has many concepts and patterns such as:

 * Domain: Logical area that defines your problem. i.e: Retail, HR, purchase, etc.  

 * Bounded Context: Logical Boundary on the code for the solution domain, can be defined as:

   * Organization

   * Code Base

   * Database Schemas

   * Services and Microservices

 * Layered Architecture: Separated Core Domain from UI, Persistence, DBs. 

 * Entities: Domain Objects defined by unique id (UUID). i.e: User, Customer, Job, Message.

 * Value Objects: Unchangeable Objects, has attributes but not unique ID. i.e: Name, JobTitle, Address. 

 * Aggregates: Cluster Value Objects into aggregates to define a boundary. One entity should be the root of the aggregate. So external objects hold a reference on the root only.     

 * Factories: Use to create complex objects and aggregates. The client does not need to know the internal details.

 * Domain Events: Record Discrete event to model activity within a system. 

 * Services: Significant process or transformation into the domain. When is not the natural responsibility of the Entity or VO(Value Objects) objects.

 * Repository: It's a service, uses a global interface to provide access to all entities and value objects within a particular aggregate collection.          

 * Context Map: Diagram to enforce strategy domain integrity. 

 * Bounded Context Patterns:

     * Anti-Corruption Layer: Wrapper for Legacy API or protect the domain from bad API.

     * Shared-Kernel: N-Bounded contexts depending on shared kernel(core). 

     * Customer/Supplier: Like a client/server has a high dependency.

     * Conformist: UpStream and Downstream teams that ARE NOT ALIGNED (accept as it is).

     * Partner: Mutual Dependency on both contexts and high alignment is needed for proper modeling. 

In order to set the record straight, you dont need to use all patterns to be doing DDD. By the way, if you are using Spring Data and have Repositories that alone does not mean you are doing DDD. DDD is a process, it's not a one-time discrete shot. There is an agile collaborative modeling exercise called Event Storming which can help you a lot. Event Storming can be quite useful to figure out inconsistencies in the breakdown of your services and save lots of refactoring and headaches in the future. 

DDD Benefits

DDD has solid benefits, such as:

  * Better comunication

  * Help Organization to retain knowledge (often a huge issue at scale and as the time pass)

  * More flexibility via strong design and encapsulation 

DDD will not do any magic for you. It's just a tool, at the end of the day it depends on how you use it. 

DDD Challenges

Like anything in software, there are trade-offs. DDD might not work well at all in a very technical project. It's also required to have a domain expert working with the engineering team, which unfortunately is complex nowadays. 

Reality and DDD

In order to organizations scale, they often split Strategy and Execution, Product and Technology. Specific people are often used as proxies to answer questions in sense of priorities and "representation of interests". That representation happens via PM(product Managers), PM(Project Manager), PO(Product Owner), BA(Bussiness analysts). There are good PMs, POs, and BAs out there but wich scale you need more and more, and unfortunately lots of times you have weak and low-performance in those positions. 

When a startup starts by definition and nature the company is super glued with the customers, the problem, and the real needs. As a company succeeds and starts growing end ends ups as an enterprise that connection starts to get weak. DDD might be an important tool to help to promote not only comunication but also sharing an understanding of real business problems. 

The Way forward

Recently, Uber rediscovered DDD and applied for they hyper-scale microservices solution, called DOMA(Domain Oriented Microservices Architecture). DDD has a perfect FIT with SOA and Microservices. It's a great modeling exercise and it's being used for decades in our industry. Analysis and Design are lost disciplines like DDD I hope we can rediscover this techniques and leverage and involve them in the present and the future.

Cheers,

Diego Pacheco 

Sunday, August 2, 2020

Design 101

Software Design is a super important discipline. However, Design is often made by accident. Software Design is really needed because there is a huge cost associated with some changes further down when you have a scale and lots of software. Lots of engineers dont understand design or understand it on a superficial level. Software design is on the core of everything we do in software and I believe we need to talk bout this super important discipline. So I made a slidecast talking about the subject. Let's get started. 

Video


Slides


Cheers,
Diego Pacheco

Tuesday, March 31, 2020

Pipelines From CI/CD to Self Operating Systems

Several years ago everybody was talking about and trying todo deploy automation. This is a fixed problem, right? well, several companies now have good pipelines but most of the tech industry is not quite there. There are several reasons why release pipelines are more important than they look. First of all, Deploy != Release, I talked about that on my previous post about Testing in Production. Several companies have doubted if they need the newest forms of CD(Continuous delivery) like GitOPS but I can say almost 100% sure, this is a must-have. So let's step back and talk about Lean and Kanban and business agility. Even if your business is not asking to increase your deploys and release frequency you should be in pursuit of that. Lean has the concept of LEAD TIME, DevOps is about Lean if you have doubts go read the amazing Phoenix project from Gene Kim. Lead time is about from Idea to Production and how long it takes to get there. Production is the best place to be, so you must increase both frequencies of deploy/release and this means going to production as much as possible.

Why Production Matters?

Production is the best place to be! There are some features that can only be understood in production via A/B/n Testing and with real Domain Observability. You might say, that's too much for me or I dont have basic testing in place why should I increase my deploys frequency? Experiments are super important for the Discovery track, some features can only be understood with real user traffic and several rounds of experiments. Experiments might go way beyond background color, CSS style and play with words to see if we sell more, dont get me wrong thats value on that. However, some experiments require backend changes and therefore you need to have different versions of you backend services somehow, either via backward/forward compatibility or via multiple versions of your services running in prod.

Besides business experiments, there is something called growth. Growths teams become super popular on SV startups and big sites like Facebook. Growth teams are the modern sales and marketing departments. Guess what are the important tools they use? Experiments, A/B/n Testing and other user experience and discovery tools. Right, that's not enough argument for you? ok.

There are companies who have several legal and compliance changes that they need to release pretty quickly and if that does not happen it means losing money and even having to be sued by customers. Right, that's still not enough reason? They think this way, imagine we are playing a Brazillian football game imagine 2 hypothetical scenarios where A) You just score 1 goal per game. B) You won't score more goals you just make sure the ball past mid-field. Not increasing deploy frequency is playing defense and playing defense is super dangerous. Not increasing deploy frequency is like piling up balls on the midfield but zero goals, what's the sense of that?

From CI to CD

Continuous integration started as a good idea but thanks to Git Flow it got messed up. Git Flow Sucks. There are several reasons, first of all, it's because is too complex and error phone, second because it is a smell that shows you architecture is fragile. Git flow becomes popular because of mobile development with often had pretty bad architecture and lack of modularity and isolation so there was several people had to work on same files.

CI was about to have the code being "integrated" all the time. This means all good in the trunk/master branch, so no long live branches, long-lived branches are the opposite of continuous integration. Wow but I have a Jenkins server doing builds all the time, it does not matter because the code is all over different branches.


Here we have a very basic and overall CI pipeline. First of all the engineer code on his local machine and do several commits on git and at some point, he pushes the changes to git. Them a Jenkins pipeline is a trigger, it could be scheduled to run every 5 minutes of after every push, IMHO after every push is much better. Once the code is checkout on Jenkins machine the build phase will be kicked in, so here depending on your language several things will happen like, linters will be run in case of frontend development with angular / react, in case of backend development like Java, Go, Rust, Scala, the code will be compiled and unit tests, snapshot tests, mocked contract tests will run. Some advance pipelines also run Integration Tests, E2E tests and sometimes stress tests. After tests pass reports will be generated in the sense of coverage and test results and the binaries will be deployed often to an application server, HTTP server or s3.

CD is the next level, which stands for continuous Deployment. It's absolutely important to understand Continuous deployment can be done with almost the same tools like CI, like Jenkins, Database automation tools like liquibase or flyway, unit tests. However, Cd requires more things like Feature Toggles / Canary and Split traffic.

Feature Toggles / Canary and Split Traffic

Here is where things get interesting since you will be deploying a lot to the production you need to be able to enable and disable features and releases and also to automatic release or rollback changes in order to scale this process without getting crazy. Split traffic needed in order to reduce risk and make sure we dont affect the User experience. 

Canary means automation and one of the superiors and final levels of pipeline maturity. It's important to have proper observability in place(Centralized Logs, Dashboards, Alerts and better instrumentation on the applications and microservices to send data to the canary solution). A good canary implementation will compare several metrics dimensions like Cpu Usage, memory, network, HTTP errors, disk usage, latency percentiles like p75, p90, p99, 99.5 and much more. Netflix does that with more than +500 metrics.  So once you have all this data you can allow some threshold of decay or say you need to be improving by 1% or whatever it makes sense of that service, and therefore this should be configured per services bases.


CD has a more complete pipeline, It's required to have automation for your infrastructure, like databases, cases, full-text search engines, messaging, load balancers and any other component your services relly on. Often infrastructure deployment happens because of service deployment and happens in separate pipelines. Often this work is done using tools like Terraform, Ansible, Cloud Formation, etc...

After the infrastructure deploys them you will push your code and run build and test like you would do in your CI pipeline, the biggest difference for me is not the fact that Stress Test / Load Tests are mandatory but what will happen is, first of all, DEPLOY IN PRODUCTION. I'm sure some folks shat their pants just be reading deploy in production. Being a grown-up means doing hard things. Deploy in production should be a normal thing, not a myth, not an "special" access that only a DevOps team can be doing (If there is a devops team there are no devops and most likely you talent tensity is low).

Once you are in production you want a test in production, reply real user traffic and as all the candy comparisons go well you want rollout to your users, blue-green is the basics, whats you want to do is release to 1% them 5%, 10%, 25%, 50%, 75, 90%, 100% of your users so if you get something wrong you won't disrupt the majority of your users.

Having Better Pipelines

It's easy to mess up with pipelines, here are some tips and lessons learned that will help you out to build better pipelines:

* Do not use Git Flow, try simple models like CI/CD or even GitHUB Flow.
* Avoid multiple downstream jobs, because they increase pipeline complexity.
* Keep an eye on Test performance, make sure you dont have flaky and slow tests, make it all parallel.
* Avoid do obscure and steps that your team does not understand. Stick to the basics and slowly improve.
* Do not hard code credentials, use Hashicorp Vault.
* Make sure you have notifications in place, email and slack are important.
* Avoid long scheduling cycles like 1 time per day.
* Consider dedicated pipelines for the infrastructure tasks like create, search, upgrade, destroy clusters.
* Try to use Terraform instead of Cloud Formation because it is much better and simple.
* Use Tests for Terraform specs.
* Make sure you tune up Jenkins agents and use proper instances size, avoid t2 medium.
* Have more than 1 agent or you will have bottlenecks
* Consider using spot instances and shutdown Jenkins overnight and weekend to save costs.
* Automate your Jenkins service too :-)
* Make engineers responsible for their pipelines and not a "DevOps" team responsibility
* Create templates and guides to help your engineers improve productivity.

GitOPS

GitOPS makes lots of sense if you are running workloads in Kubernetes, it does not matter if is on Ec2 with Kops or with a managed service like EKS or GKE. The easiest way to go EKS on AWS is with EKSCTL by the way.  So GitOPS means that all kubernetes cluster spec changes go to GIT, via Pull request which is super great, it does not matter if you use plain yaml specs or if you are using helm charts(luckily helm v3 because <= v2 its a bit ugly).


GitOPS is not that different from CI/CD, there are just a few differences, first all it's all trigger by Git hooks via Pull Requests. In your build phase besides the application build, you also need to build the docker image or any other container runtime or packing format you might use, in the future maybe we will all be using WASM.  Them you run your tests normally and when you will deploy, first of you need to deploy the cluster changes and laters on the application changes. Using kubernetes canary, Feature Toggles, Split Traffic is much easier to do it so.

Self Operating, Self Healing, Self Remediation Systems

The next level which goes beyond GitOPS is self-operating, self-healing, self-remediation systems. Thinking like a Tesla car who auto-drives, auto-parks for you. You might want to check out some of my experiences with these systems in my previous blog posts:

Experiences Building a Cassandra Orchestrator(CM)
* Lessons Learned using AWS Lambda as Remediation System

The whole idea is simple. If you think trought its not crazy at all. AWS  and GCP offer more and more services like that, called so "Managed Services" like RDS, ElastiCache, S3, MSK, EKS, and the list go on and on.

If self-operating, self-healing,self-remediation systems are the future why not everybody does it? First of all it all depends on your use cases and scale. If you can you should use managed services if you use another open-source solution and is super important to your business and you have lots of use cases on it them it would make sense to build a self-operation, self-healing, self-remediation system or internally managed services for short. For microservices, GitOPS should be enough for you, for the DATA layer you might need to go one level down.

Improve Business Agility

Teams are agile, agile has +20 years, now we need to go to the next step, Organizations need to be agile they need to have agile goals, Think more in Impact and Outcome instead of output/feature for product discovery and there is no sense to do that without improving the reliability and time to market. Therefore having better pipelines is a must-have investment you need to do and will pay off in the long term.

Cheers,
Diego Pacheco

Wednesday, March 25, 2020

Software Architecture and Architects

As a consultant, a question I got a lot is what is software architecture anyways? What should architecture do, what is the skillset it needs to have? So, first of all, I believe everybody in your team should be a software architect. That's the silicon valley way. Brazil has a huge demand and very few qualified people for us to work in that model which ends up having a few software architects per company. Hiring is extremely complicated, slow and difficult and easily you will pay a lot for someone who is not a proficient architect. However, develop these skills is a good idea for every engineer there are a couple of problems like A) Not everybody wants to be an Architect. B) It takes time. Companies dont have time and the demand is here; So this forces a pre-mature software architect exposure. At the end of the day, it does not mean this is a bad thing. Having opportunities is great for everybody but it all depends on how you develop and use your opportunities.  Going back to the basic questions, what is software architecture anyways?

What is Software Architecture

Architecture is about Big Rocks. Which means you won't fix all problems at the architecture level. Architecture is about the foundation. Foundation is about structure and important tech decisions like should we build the component in Rust or Go. Should we use Cassandra or Postgres? The structure can also be seen as design decisions like should we use Port and Adapters or MVC or We need to have these classes working on that way.

The Software Architect Skillset

There are several skills a software architect needs to have. Leadership is one of the main skills. You need to be able to provide Guidance for the engineers. Talk with the business and the customers in order to get Requirements and get ahead of problems before they happen. There other important problem-solving skills you need to have like Critical Thinking, System Thinking. A solid architect knows architecture models like Soa, Microservices, Serverless, Monolith, Actors, Seda, EDA, and so on and on... A solid architect knows Design patterns like Gof, OOP patterns, FPpatterns and principles, REST, EIP, EAI, and much more.  Architecture is about Trade-offs, a software architect needs to be able to evaluate trade-offs properly.

algorithms, Data Structures, Databases, and Cloud computing are must-have skills for a proficient architect. DevOps engineering is not optional, there is no way to design a solution and does not automate, add observability and think and operate properly in production.

I always believed engineers are smart and you should threaten them as smart people. I never like the idea that all problems should be handled on the architecture and all Jars and problems should be abstracted away from the engineers, this is non-sense.

It's super important to know what not to do and what technology not use and why. At the end of the day it boils down to use-cases and proper homework. Thinking about the nature of things helps a lot.

Video

I recorded a video talking about: Architecture and Architects and I hope you guys like it.


Architecture and Architects from Diego Pacheco on Vimeo.


On the video I will be also answering the following questions:
 - Do you want to be an arch?
 - Should the Arch CODE? Powerpoint architect?
 - Java Architect Vs Software Architect
 - How much experience do I need to have?
 - How to Improve? How to become an Arch?

Take care! Stay Home, Stay Safe.

Cheers,
Diego Pacheco

Wednesday, February 5, 2020

#NoEstimates: Forget Buildings and make Digital Products

This is a complicated matter. Every single company on the planet deal with estimates somehow and use some kind of estimates. There are people who are pro-estimate and belive giving an estimate is a professional thing and we need to do it and there are people who believe we need to reduce the number of estimates we do(I'm the second kind of people). Estimates often are wrong and incorrect. However, there are people who are really good on the estimate and get it right with very few error margins however when you look into details you might realize that being good on estimates might be killing your business. You might think is enabling you to sell more and get better but easily it could be the other way around, no worries I will answer why. This is a very hot and passionate topic so brace your self and let's go. Estimates are old, most of the time they are lies and they are not reliable however we continue to work with estimates expecting they will work when they dont work.


The Issue with Estimates

There are several issues with estimates, let's get started with some:

* Estimates are done when there is too much uncertain(Uncertain cone)
* Estimates are often done by the manager who does not deliver the work
* Estimates are often done when "requirements" are not clear
* Estimates does not take variation into account
* Estimates tend to be "underestimated" meaning always assuming is easier when is not
* Estimates tend to not count, judge or be cased on any concrete thing
* Estimates does not take continuous improvement into account

There are many issues with estimates. Several managers estimate things in hours or even minutes with makes things even more complicated and hard to make it real. Estimates are used for the wrong reasons like:

* Feeling SAFE
* Selling Software
* Measure of progress
* Return of Investment

Several issues related to Estimates are related to traditional projects. Projects are often problematic too because they make us go for (Escope, Time and Cost) instead of Value or Organic Growth of our product. Estimates make Investors and non-tech people feel "SAFE" because they know when will be over.  However great digital products are never over, so does anyone think when Facebook or Lyft will die? Does anyone estimate when your company will be over? I dont think so, A business is a "live" thing we assume it will never be over and we try to invent and re-invent the business so it never dies. If the business never dies, there is no over, if there is no over, there is no DONE if there is no DONE why do we need to know when the software is over? (Because it makes us feel better).

Most people and companies still do not understand software, people think they understand software but in reality, people see and threaten software as a building or a bridge. A building or a Bridge can only be used when they are over but the software does not have the same properties. What are the properties that software has:

* It's easy to change (compared with bridge and building)
* It can be used before the "whole" software is done
* Is cheaper when it is LESS(1-4 weeks), Expensivier when is MORE(bigger project - 1,3,5 years).

Software under the wrong architecture and full of Debt can be very expensive and slow to change. However, a good architect and managed debt software is super fast to change and allow fast cycles of innovation for the company.

Why we can only think about the "whole" software? Could your business start thinking in smaller batches(Lean principle)? Smaller means less investment up-to front, less risk, and fast LED time.

Commitment vs Involvement  


Estimates should be a "Forecast" which means it might not happen. The big issue is companies take Estimate as "Commitment" which means you need to deliver on that date - often called DEADLINES. In my experience what I see is companies producing because of results, because they want, follow they estimate like:

* Produce Poor Tested and Poor Coverage software
* Create more bugs
* Sacrifices user experience
* Build a mediocre product because only prioritize easy user stories which are easy to estimate
* Bad Culture: pushing talent away and getting old mediocre engineers

Estimates can be really demanding for your business. Pursuing bad target date will make you compromise things that might cost your business in a long wrong. Especially if you just prioritize Features and dont do refactorings, so in this case you are really creating a time bomb.

The #NoEstimates way

#NoEstimates like anything in Tech has a bad meaning. It sounds like we are killing estimates completely. Actually, #NoEstimates means reducing craziness. Reduce the usage of estimates and work in a different way, however, you will have a "forecast" and will be able to have some kind of "prediction" still gonna have issues and might not happen but is the best thing we have so far.

* Use User Stories
* Estimate every user story maximum 1 day == 8 hours effort
* Use Statistics or yesterday wheater technique
* Use Moscow and have: MUST, SHOULD, COULD Targets
* Use BurnUp release charts
* Have small releases 1 week to 1-month maximum
* Stop asking people to "estimate" things
* Consider the role of Variation

Software projects still focus too much on OUTPUTs and we should be focused on OUTCOMES/IMPACT for the end-user which matters most. Remember users do not care about features, they care about you fixing their problems.

The Role of Variation 

The hardest part of estimates is variation. We often do not control variation, variation is never taking into account when we do estimates. Variation is not necessarily bad. You actually need variation, this is the tricky part. What is the variation? Let's talk about some variations sources:

* New Technology
* Cloud Computing
* NoSQL
* Big Data / Streaming
* Machine Learning
* New Team Members
* New Markets
* New Personas
* Team composition (Add / Drop People)
* Domain Knowledge
* Dependencies
* Competitors
* Waiting For Availability
* Blocks
* Workload Factor
* User Story Size

There are many more sources of variation. Variation make our estimates to grow unpredictably. As you work more in the same: Team + Domain + Tech you tend to get better however do not think variation is the root of all evil because having no variation might mean super BAD NEWS for your business.

Why Getting Estimates right might kill your business

If I get my estimates right it means I controlled variation. Which is good if you want to create the same CARs all the time. Let's say you are producing TELSA model X cars, great! However, at some point, you will need to introduce a new model and innovate In that case you will need to introduce variation them your predictability will get low and there is nothing you can do.

Innovation means adding more variation and blowing up estimates. Diego, I', not blowing up my estimates, I always get them right, awesome. Are you using new and better technology? Are you improving your Ux? probably the answer is NO. Which is bad right, you are killing your business because you are not exploring new markets and maybe not growing. The selling feature has a very limit window of opportunity as you hit that you will be forced to innovate. This means, add variation and have estimate issues which are good because it means your company is alive.

The good news is this is the same constraint for all Tech and digital product companies so are fare for everybody. At the end of the day, dont worry much about competitors, worry about doing the right things and deliver great user experience via A/B Testing and Discovery Experiments, sound and safe engineering and be able to adapt and deliver fast - this better property then getting estimates right.

Cheers,
Diego Pacheco

Tuesday, January 14, 2020

Why do we need a Clean Code DETOX?

I believe a lot in Agile and Lean Principles. Agile movement historically often focused too much on teams and really left Software Design and Architecture behind it. Regular Engineers often belive a lot in Clean code and take it as a dogmatic bible and only source of truth. Clean code has some good stuff like the Boy Scout Rules(Alway left the code better than you found it). However lots of clean code "truths" are not so "true" at the end of the day. I've found considering the code without a Design and Architecture, extremely dangerous.  Most of the time I saw the worst codebases ever was related to very poor Software Design and very poor Architecture. Having a Good Architecture and Good Design does not mean you will have Good code, however, if the Architecture and the design write the code is very simple and easy to change. However, if the Architecture and the Design are wrong it might be impossible or very hard to change the code.

See the Forrest not only Trees

The right Architecture provides us ISOLATION, which means not only contain the blast radius in case of failure but also give the ability to use to DELAY some change to do it later. The Good delay property happens because we reduce the impact on customers via SOA / Microservices principles like isolating the database from the external world, having explicit versioning for contracts, having backward compatibility, having a bounded context and making the service working independently(Operations: Deploys, Databases, Runtime) from other services. Having the wrong architecture will mean sharing a database with multiple services, therefore having direct table access to between multiple services. Doing so ill hurt the ISOLATION property, therefore changes will be hard to make since you will break other people and in practice will be much harder to change. In other words, having the right architecture enables Isolations, Changeability, Debugability, Observability, Re-use, Speed Time to Market, Composability and many other interesting properties. Architecture means architecture. It does not mean Backend architecture only, it also applies for frontend(mobile/web). If we think about Micro frontends and Components they provide the same benefits as I described early.

Another way to see it is, Architecture and Design are the Forrest, Code is the trees. We need to be able to see the Forrest first an the trees later. If we see the code first bad things will happen. I'm not saying good code is not important but I'm saying for sure is LESS important than Architecture and Software Design.

What Really Matters?

When you are doing a code review, what really matters? IMHO:

1. Are we doing the right architecture?
2. Are doing the right design?

After these 2 questions, let's talk about what matters in the code, IMHO:

1.  Is the code SAFE? (Are we doing bad practices like unsafe memory mgmt).
2.  Is the Performance right? Are we doing the best performance? Do we have a slow code?
3.  Does out code will scale? Do we have the right data structures in place?
4.  It's our code testable? via Unit, Integration, Contracts, E2E, Stress/Chaos Testing?
5.  It's this code flexible? Can we change later if we need it?
6.  Is this code reliable? It will always work as expected?
7.  Is this code OBSERVABLE(Observability) can we understand what happens from outside?

Often this questions are not addressed in a Code Review.  Now I will talk about what happens most in code reviews, most part of the times.

Clean code is about Style

Let me tell you something. Once I was a Clean Code Zealot. Not anymore! I'm +2 years clean from Clean Code, thank God for A Philosophy of Software Design Book!

Most of the time, clean code means Style. It means having names, a number of lines and a number of methods. Often these 3 factors are not really important. They are subjective and change from people to people. People tend to spend massive amounts of time denying code reviews and going back and forth based on style and spending ZERO time on the matters that really matters like Architecture and Design(Look the 9 concerns I said above).

Style does not matter. It's a waste of time discuss style. Really bad things happen when we focus on "clean code" and does not focus on architecture and design.  What are these bad things that happens(...and they happen all the time):

1.  Waste (money, time, energy) in concerns that do not matter.
2.  Miss guidance - instead of focus on important design matters like(should make move this code to another component/service? are we with the right test coverage in place? Should this code be specific or generic? Should we create a library or should we keep as it is?) We end up focusing in the number of lines and number of methods. IT sucks giving names. i.g: NoSQL, NoEstimates, BigData, etc... Why do we spend so much time in something is so relative and subjective?
3.  Less VALUE delivered - using this time we could be able to deliver more value to the customer.
4.  Worst Understanding: Clean code does not make the code easier to understand. The right architecture and the right design does. Having small methods like there is no tomorrow and separating things that cannot work/live together does not make any advance and the opposite it creates more complexity and more obscurity, therefore, more cognitive load to understand things.
5. Worst Design: Right design requires thinking and TRADE-OFF analysis, often engineers do not value the cons only the pros. This creates a very unbalance and narrow-minded view of the solutions. In order to have better DESIGNs: Architecture, Design, and Code we need to analyze trade-offs.
6. Flaky Tests: Since we dont get the design right we end up testing things at the wrong level and have tests that are flaky and break often. Flaky tests can also be created by other reasons like bad test practices like hardcoded IDS or not doing proper data setup and tear down. However, having the wrong design will often lead to wrong test initiatives.

All these issues are created for the lack of the *Design Thinking*(PS: I'm not talking about UX). Often Engineers get the wrong definitions of a Unit. Not everything should be ATOMIC. Clean code does not encourage this discussion because often focuses on one very specific and not a precise thing: Style.  Style happens because of poor languages. If you compare several languages like C, C++, Java, DotNET, PHP, NodeJS, Python, Ruby, Groovy you may realize this language are pretty similar and have only syntactical sugar differences but the mindsets are the same. 

Strong languages like Haskell, Clojure, and Rust do not have this problem (they have others) but they have less space for style since the compiler has a more strong and opinionated role and the languages have less blank roles that can lead to poor decisions.

Why do we need a Clean Code DETOX?

It's s clear to me we need a Clean Code DETOX. In 2013 Rich Hickey gave this killer presentation. Where he provided several insights but he said languages, framework and libs are like musical instruments and he lay down two facts:

A) They are made for PROFESSIONALS, not for beginners. Musicians spend very little time as a beginner. Interestingly enough I see developers spend YEARS as beginners even they are called Architects but they do not STUDY therefore do not really improve. 

B) It's okay to have effort. In software, we see effort as a Bad Thing. We see effort as waste. So it comes to the "Developer Evangelists or Developer Experience" guys saying developer life should be painless. I think like Rich Hickey, if professional musicians can do efforts, why developer cannot? Do we threaten developers like adults?

Clean code it's not the solution. Clean doe will only give you the FALSE idea of a solution. We need to learn how to Challenge our assumptions in order to truly learn and improve. I think clean code time is over and we need to think more about Design.

In case you are wondering what is Design (Look Rickey Hickey video) he talks about it. Design is about the Structure it's about how it works. Design cannot be generated. The design must be planned and executed. Good Design is about the obvious structure and fights against obscurity which leads to complexity. So design should be simple. Having more methods, fewer lines of code, changing names not necessarily make the code obvious and the design simple.

Cheers,
Diego Pacheco

Thursday, December 19, 2019

7 real values from software beyond estimates

Estimates are lies, estimates are not reliable. It's super common to have companies doing estimates completely wrong. There is no way to do estimates right, however there are ways they can be even worse than usual like:
A) Having managers doing estimating for engineers.
B) Not accounting holidays, Refactorings and Bugs.
C) Not comparing working items
D) Ignoring variation: Different sizes, complexities, technologies, needs.
E) Not understand when the system is stable or not.
Very often estimates are done before the project or product start and where variation and uncertain is sky high. When we take a look into PMI, which is based on bridges and buildings we still see buildings and bridges with extreme delays, extreme over budget and poo quality. If this is true for construction engineering why the hell would not be true for software engineering where we barely have 50 years of experience as a industry compared with the +2K years in construction engineering. Project after project, year after year, company after company no matter how mature or immature or how sexy or old school the project / company is, this matter always come to surface which great disagreement and often stress related to the discussions.

The Need for Mindset shifts 

Time to time, companies who want to survive and reinvent themselves need to let some old culture, values and old ways of doing things go in order to achieve better results. In order to change companies need to break old paradigms and learn different ways todo business and learn new mindsets, skills sets and toolsets.  The past does not define the future. No matter how good and how top performer you were there is a point where everything change. That happens to the top of market look Blockbuster, Codak and several other companies who were leaders and basically bankrupt. However you cannot do a different process, and use different tools, if you still think the same and your values are the same.

In order to Learn you need to Unlearn

When we were kids we "kind of learn" to learn things. Easily someone could point out that we bareilly learn how to learn and actually we was tought to "follow" and to be "complainant" but never to truly think critically and outside-of-the-box. Besides the fact education sucks, let's say you were luck and got great education even so we are not tought to underlearn, to let it go and to re-invent our values and mindsets.  I really like AWS philosophy of learning, they pretty much innovate based on the idea of "recreating" what never changed. They did it very successfully in AWS in several fronts like SOA/Microservices instead of traditional monolith solutions, Cloud-native databases like Aurora(where they decoupled storage from computing) instead of traditional monolith db architecture, Firecracker an others innovations instead of traditional virtualization. This year(2019) I had the pleasure to goto vegas on the very first re-invent and sow this philosophy in practice, for sure this is one of the reasons why AWS is so innovative and successful because they unlearn all the time.

Tell me how you measure me

There is only 2 kinds of measurement. A) By value. B) By ability to GUESS right. unfortunately too many companies only care about item B. In the end of the day looks like the only thing that matters is if you delivery all items you guessed on time. Allan kelly wrote some amazing books about no-projects and continuous digital and project myopia. Where companies endup pursuing Dates, Features, Cost instead of benefit(value).  Talking to management, business leaders, product leaders often they will say to you that they care about value, but in the end of the day, they don't know what value means, they only know what cost, time and list of feature which is a very old school management 1.0 behavior which does not work well on the digital world we live.

What Value means? What real values can we get?

I you like to deconstruct value and pretty much say 7 samples or 7 real values we can get from software beyond beyond a professional guesser(which nobody is - everybody suck doing guesstimates).

1. Sustainability / Safety / Quality 

I really try to avoid the world "quality" as much as I can but I'm talking about quality. The reason I try to avoid the world quality is because I dont think it best map the concept to the reality we need. Secondly because people often think about quality with compromises. The first thing is sacrificed is tests, people often dont have enought automation and they are swinging on technical debt which really kills they productivity.

Having a Safe or Sustainable system means this is a pre-requirement and is non-negotiable, there is no way to work without safety, we need understand that when we: kill tests, deliver crap code, dont automate and piple up technical debt we are killing our productivity and creating bad experience for the final user and really throwing away all the business investing on the product.

Even if you dont deliver all the 100 items your business want or you think you could do it you still are adding lots of value if you deliver 50 items with proper safety and sustainability. This is the first think people need to realize, the first real value in software is sustainability.

2. Culture Transformation 

Very often as a by-product, delivery projects or transformation projects often delivery new mindsets, new culture, new toolsets, new business capabilities for the company. Even if you are not delivering the 100 items you promised to the business and you tought you could do it, let say you delivered 40. There is still value if you help the customer to acquire new mindsets therefore transformed the customer.

There is a real value in learning: A) how to do proper software engineering. B) Proper software architecture. C) Proper software Design. D) Proper DevOps Engineering. E) Proper Agile Coaching. F) Proper team culture, feedbacks, psychological safety. The list goes on and on. This is often not see as value, companies need to start realizing there is extreme value in deliver a digital transformation to the customer. Even if you miss your deadline and could not GUESS properly the ALL OUTPUT they want on the DAY they want.

3. UX / CX

Customer Obsession is another super game changing value Amazon and AWS have. The only way to compete properly is doing the right investment in UX(User Experiment) and CX(Customer Experience) otherwise your competitors may outperform you.  Often UX/CX is not measured, as companies only care about your GUESStimate which you missed. Let's say you need to deliver 100 items but only delivered 45. This item as having the right UX it's a huge value that potentially could drive revenue for your company and grow your user base. UX/CX is the third real value from software delivery which again is bigger than being able to GUESS the right number of features on the scheduled.

4. Waste Reduction

Lean is all about learn how to see WASTE and REDUCE / REMOVE WASTE. Kanban is a lean method therefore is all about waste reduction as well. Kanban is also all about changing your management behavior which could be a huge source of waste. Again let's say did not deliver 100 items but delivered 35 but you did it properly which out doing feature yours users dont need and without Big Design Up to Front(BDUP) and piles of tech debt and proper priorisation, is very likely you reduced waste, this means cost savings. Removing waste is value. Even if you did not deliver as much items as your business want. This is the fourth real value from software, reduce waste and this value has lots of importante not only economically but as a mindset so your team learn how to self-improve and always tune the system, the process and the solutions. There is value on it.

5. Stable System

Dr Deming always talked about STABLE SYSTEMS and VARIATIONS. Unfortunately management still dont get this right. Several times variation is produced by the system itself and not by people, so it's not people fault but is a system fault because the system is not stable.



Variation is sometime most of managers do not understand. Also one of the main reasons why estimators are never get it right. Variation could be cased on the size of the user story, complexity level, hidden dependencies(which appear on last minute), technology which the team is not productive yet. Having a STABLE SYSTEM means we control the variation as much as possible and have mechanisms to deal with variation and reduce it as much as possible like doing: PoCs and/or Dual Track Agile Discovery Track and/or experiments. Having a STABLE SYSTEM is a real value from software because it means you understand what you're doing and you can improve the solutions effectively and also the team throughput or maintain at least.

6. The Right Solution 

It might sound obvious. However is common to have the "wrong" solution which means, features or software that people don't want or dont want to use it. YC mantra is a successful startup need to build products that people LOVE. Steve jobs once said "The life is too short to build products that people don't use it". Build the right product is complicated, it is not based on a single person point of view. IMHO the right solution is discovered, so you need to have structured discovery process like DTA(Dual Track Agile). Companies do Design Sprints and use some lean startup techniques but often they do that as as Single shot on the beginning of a project or product, however that need to happen continually and in full sync with Architects and Business Analysts.

Let's say you need to deliver 100 items but you delivered only 60 by the time your business expected, IF of the 60 items you delivered they are the "right solution" there is lots of value on it.

7. Predictability 

This is the last item I consider part of value from software. This item is very "subtle" and could easily be confused with estimates. Predictability and Estimates are different things. Estimates are lies and they are not reliable however you still have have a consistent "trend" and still do not ask your engineers to GUESS any work they will do. In order to archive it, which is not easy, you need to have a stable system, so variation is contained and managed(which often means break the stories at the same size - let's say 8h stories).  Kanban predictability work based on very simple math, like getting the weekly outcome of the team multiplied by the number of weeks. Let's say your team deliver 10 items people, in a month(4 weeks) you will have 40 items, Let's say you define a MVP release and you allocate 80 items. All items have same size, therefore if you do 10 items per week in 8 weeks you can deliver it.

The good thing about having a "delivery goal" for the team is you can tune the system based on weekly progress. Basically thats done by doing RCA(Root Cause Analysis) for bugs and user stories which did not happen on normal basis(meaning anomalies or +8h work).

This is much better than asking the engineers to estimate items because they items often have different sizes and different complexities. There are some gotchas here like, you still could have variation, meaning, unknown hidden dependencies(so you need todo a killer work on discovery), you still could have dependencies on other teams(you need todo a killer work on foundation track - TTA post). Also is possible that you introduce new technology which your teams does not master which will add variation and again affect your toughtput.

How to deal with variation again? Basically you can create solutions that simply software engineering via an engineering organization or even a foundation track on TTA, Another option is to think about "generic" solutions like component and generic services where you could reduce good part of boilerplate or "common-code" and them let the engineer be more productivity.

You also could work on a: MUST, SHOULD, COULD targets. So let's say you MUST deliver 30 items, SHOULD deliver 60 and COULD deliver 100. This way if you miss SHOULD is not the end of the world, also this technique forces the business todo better prioritization and reduce the blast radius of variation and might happen.

Other important practice is show this Burn Up chart every week to the business and NEGOTIATE if hidden dependencies appear, bugs arrive, people get sick, new stories appear. I'm not super in favor of changing dates but I prefer to use creativity and always reduce items on think in SIMPLE solutions.

What we can do better as technology professionals

First of all we do a very poor job explaining to the business and customers what value means. By doing so, often people think value only means deliver the WHOLE software on time on cost with all feature they need (classical PMI success criteria for projects).

Small & Conninouts MVPs are also key for keeping the business engaged and always give visibility that the team is delivering value even if that value is not ALL the software or ALL super usable. My experience and understanding is that for new softwares is always easier to create MVPs however even for existing softwares(digital modernization) is possible to create small MVPS but you need to know your game, be creative and sometimes trade features or process or more work on the user side.

As technology professionals we not only fail in provide better education for your business and customers on what value means but also fail in have small frequent releases to reduce tension and make progress more visible.

Cheers,
Diego Pacheco

Thursday, May 10, 2018

Internal System Design: The Forgotten Discipline

Several years ago it was impossible to think about software development without having at least a business specification(usually in a word document) and a bunch of UML diagrams like package, class and sequence diagram. That was a pre-agile era where process and formality ruled the IT software development industry(yes folks, yes I'm old). Back on that time software engineering was pretty much conceived as "process".  Now we live in a more civilized era, however, back on that time, there were some interesting and valuable things(tools, techniques, principles and even practices).  Like the English expression, you need throw bath water but keeping the baby. I was wondering why these phenomena happened and still happen today. First of all, we are SOCIAL animals we tend to have some kind of "fashion" behavior where we follow the "flow". Needless to say that UML and Software internal design is not quite popular today with the new kids. I don't miss the process-formality-oriented times don't get me wrong. Back on that time, people used to create things for sake of creating things, lots of times we were doing simply raw CRUDs and really this was just a WASTE. However, sometimes you do have things that are very complicated to do. Plus the fact that we work in TEAMS and when you have to make several people CODE at the same time a COMPLICATED and DISTRIBUTED system, well things can get messy. For such times I think to make sense get back to the roots and revive some of this arcane tools and ideas but without the process-craziness :D

How to Build a plane on the Fly

So let's say your time need to work in a complicated system(green field) from scratch all together. So what do you do? Start coding like crazy? Well, that might be the worst thing you can do. Because is very likely you will create tons of technical debts. So if your team create a sort of mid-level design of the internal system would be possible to parallelize the work in a sane way. So if you need to build a plane you can do the right wing and somebody else could do the left wing without having the fuselage and that should work. The rationale behind it is the same core thinking we see in SOA(Service Oriented Architecture) and Microservices. The main difference is that one if EXTERNAL and the other is INTERNAL. So if we talk about microservices as long as you have the CONTRACT you can mock the service and build a dependent service without the original service being done. Same property can be applied to internal system design.

Economically speaking this approach will be way more efficient and productive way less technical debts. This does not mean to create a BDUF(Big Design Up to Front). Why not? Because you can and should validate the core ideas before creating this internal design. If you do some small-scale and focused POCs is possible to validate the plane on a small scale and then you can produce it on a larger scale. This is one of the main difference from the approach in describing now from the approach was used on the dark age(where folks design a BDUF via committee and then when some poor developer tries to code if they so that nothing works) so that's one big difference. When you stop to think about this you might realize this LEAN thinking. Look Lean Startup movement for instance where we validate the ideas, market-product-fit before building the solution. It's the very same principles.

In a Lean Startup, we analyze the landscape(industry) that we are targeting in order to compare the solution with other startups and solution providers. For engineering, we can and should do the same - that why we can compare with existent framework and solutions and analyze what they do well and what they don't so well and why. Doing so it will make our core value more unique in this case when we talk about engineering it will reduce the chance that we make same mistakes that other did - that's why is very important to read papers, see videos, look code and understand the problems you are about to face.

Typing is not the Bottleneck

Don't get me wrong, I'm a hacker but I do have my think that as well. Some problems are fairly trivial and it would be wast add some internal design load on it, however, some problems are complicated and make sense to think before doing. Since thinking could be almost as fast and the speed of light, typing definitely has more latency. The code is just a way to EXPRESS the solution, we think with our brain not with our fingers AFAIK.  Rushing up to code won't make the problems go away. Thinking about the problems will help to address the problems. This might be obvious however in daily basic we often forget that. Several companies might also consider that you are not working if you don't have your IDE open and are not typing code.

When you just think about the code you often lose powerful abstractions. So let's just drawn diagrams and don't ever open an IDE? No, not at all. Extremes often lose important things. Without coding, there is no delivery. We deliver work via code. However, engineering is way more than just typing.

Packages, Interfaces and other Contracts

Packages group similar classes. Similar classes can be grouped by a "concept" this concept represents what the class is responsible to do. This is a SOLID and RDD design principles. These design principles are capture better when used with Color UML. Color UML we use different colors to represent different "responsibilities" or "roles". Having said that the number of packages can be a design smell that might say that if you have several packages, you have several concepts so you might have a module/package that is doing too much and you might:

  • Overcomplicated things and shall refactor the code/design
  • Should break the module in more modules
  • Re-design since you might have a leak in your design, therefore, the wrong abstraction
Having said that you have several elements of your internal contract that is composed of packages, interfaces, and methods of course. All these items are like the plane assembling map that you saw at the beginning of this very post. This map important because allow your team to speed up and parallelize work in a sane way. 


Internal Design is really that important?

Yes, it is. That's the same thing as asking if you should have clean code or write unit tests. We all know this is not about quality but about economics actually. Saving money, time and energy in a long run. However we need to keep in mind we are living in a system of system world where we have cloud-computing, microservices, kubernetes, serverless. Why that matters? Because more and more we SHIFT responsibility from the internal systems(microservices) to the upper layers(cloud, kubernetes, serverless platforms) this is one of the big reasons why you can leave with a bad internal system design in a microservice world because that bad design is ISOLATED. However, if you are building distributed systems(a.k.a not only microservice this become more and more important).

A monolithic/duplicated code is better than bad Design

Doing a good design requires time and experience and study. So if you working on something that you don't have experienced is way-way-way better to avoid over-engineering and do simple and monolith things. It's much better to have a single class with 10 methods and 1k lines of code than 10 classes of 10 methods because the duplicated code is A) decoupled. B) easy to refactor and understand. A bad design might be way harder to refactor than monolith code. The same thinking is applied with microservices.

The evolutive design is about that. Doing things in waves is better than a single shot delivery. Needless to say, it's agiler, has less chance to fail, improve the sense of progress, since you are delivering more tasks. This can be achieved with a very simple kanban principle(reducing WIP limits to increase throughput) how? Limit your pull requests in 10 files. I did that with my team and that's was like pure magic.

cheers,
Diego Pacheco

Saturday, March 4, 2017

From Quality To Safety

Quality is such an overrated word. Itś so 80s to say that you are doing something for quality sake. Today quality can appear with a different meaning -which often means specific things which people care about let's say Green or Organic or Oil-free.

When we are are talking about software development it's the same thing. Quality is a 2k thing and nobody uses in this way anymore however when you think more most of the times we are talking how we do things like automation or microservices or Chaos Engineering this is what we do and how we do it. It's quality but with a different and specialized focus.

Cultural glasses 

Engineering Software is something fragile so it requires special attention. As much as you pile out your Tech Debts you could be harassing your availability. If you are in a tech company which an online business this is an easy sell, however, depending on your industry or if your software is in a back office space this could get hard as sell ice to Eskimo's. In the end of the day this it's all about your industry and how much people see and understand things. So it becomes cultural. People who do not understand engineering might just care about COST.

Every company needs developers which it's good for us however not every industry and company are equals in mindsets and culture which can make your life easier or harder. Most of the managers know about Tech Debts even the ones who never paid. I was thinking more about the subject and I think it's not a good metaphor for your modern times and often it's very overrated and people just don't care anymore.

Piling up 

It's easy to find projects where teams are piling up tech debts. Itś a likely that the software is not critical to company survival or the company really does not care about availability which means downtimes are fine or delays are fine. Most of the companies what to have benefits of engineering culture but not every company wants to do the investment and has resistance to endure and stick to the disciplines to archive good things.

Several times software just keep working so it's very hard to argue with management when everything is just working and you are saying you don't like your code base or you don't have enough coverage or that the architecture is not good. Well it's very simple SCALE changes everything when you do have SCALE and need to have AVAILABILITY there is no space for tech debts and bad architecture, however, that's not the reality of most of the companies. That's why things kind of keep working even when everything looks and sounds very bad.

Safety Movement

There is an interesting re-framing movement which calls safety as the new quality. This movement is led by Modern Agile folks. Safety it's related to have all things needed to not create accidents which will create harm for you or out environment. Let's think about tests, for instance, see tests as quality is one thing so you can argue you don't need that much. However when we talk about safety that's something by default is not negotiable. You can not skip safety. It's a rebranding but I have to say it's very much applying metaphor for me.

I was reading a very interesting book around Shareholder Value myth which pretty much say that maximizing wealth and reducing COST could be a bad thing for the world and for people who work in a company or are in the environment the lie. The book has several cases where safety was put behind and create several huge incidents which not only destroy companies and create huge problems to the world like the deepwater horizon case.

IMHO the metaphor is very nice however IF nothing explode or people don't die which is likely that not happen I don't think this will stick. The reality is IF you need to SCALE you can only get it right or as some wise said once "Survival it's optional" you can always fail and die :-) The industry always shape companies so it is what it is.

Cheers,
Diego Pacheco




Tuesday, November 10, 2015

Being an Active Architect


This could sound strange. Martin fowler said once, who need architects?(fowler article). I always believe that to be specialist in something you need to that thing, for me is very complicate the view of *Specialized Architect* the IT Industry have. First all IF you dont CODE you are not an architect anymore, because CODE is want make you pure, its the bound that make you practice every will keep you current. If you think about money when money become with no value? when the coin is not current, so if the coin is not running and its old its consider not current and lost the value, why for software architect we think just because you did something 5-10 years ago you still have value? Because is far as i know things change pretty much everything is sense of technologies from 3 to 3 years.

There is value being a mentor and give guidance for other architect, discussion high level solutions are well but this is only 30% of the problem, that's all the piratical, operation and production point and perspective you just get doing, as soon as you stop doing you become a manager not an architect.


Most of architects are not architects maybe they never was, in fact they might be just manager who know about old technologies, hold one so watches the different for the traditional manager in comparison with an architect or enterprise architect with you like it more? For me none. There is people who believe if you code you will never buy technology and will be always doing stuff in house, i cant blame they but i dont think that's true or accurate. Architecture is about foundations and requirements you need to know you problem well but you also need yo know the technologies well so them you can pick the right chooses. Even when you picked, its just power point and it only be valid once you put into production them it makes real.

Production is a interesting aspect right, lots of architects dont think about production, they just thing about APIs and development, so this is not software architecture for me, if you dont think how things will happen in production is like to make a paper boat and put into a middle of storm with vikings they will destroy your paper boat(software) and it will fail. For all this reasons the architects needs to:
  * CODE
  * To Benchmarks
  * Run Stress Testes
  * Do Chaos/Failure Engineering
  * Refactor Code
  * Learn new Languages
  * Try new frameworks
  * Know formal models
  * Understand Requirements
  * Understand Technologies(Good, Bads, Dev, Ops and Business point of view)
  * Lead the team
  * Be a mentor
  * Share
  * Be Humble
  * Read and review code from others
  * Going to Tech Events
  * write his own ideas
  * Reading Books
  * Reading Papers
  * Watching Videos
  * Doing Complex POCS
  * See other problems, other points of view
  * Look for Failures, Issues, Bad Cases, Anti-Patterns
  * Do Consultancy in more them one project(know more than one business)
  * Write TESTS
  * Understand / DO Operations

This are the things that make you CURRENT and most of this things are central to CODDING, speaking about code, teaching about CODE, managing CODE, Training people about CODE, writing CODE to Operate CODE(a.k.a DevOps Engineering). The problem this things are dynamic and we always changing everything, so there is not way to stop doing this and still be Active otherwise you are just a Manager.

Architecture is not about doing everything, is not even a single man job depending of the size, scale and complexity of you problem, but for sure if you cut the coding part its clear you put your self into the patch of deprecation, and people dont realize this.

Cheers,
Diego Pacheco

Sunday, September 6, 2015

DevOps is about Anti-fragility not only about OPS

The IT-industry always got 1 thing of of 10 and just because they have 1 thing they think they got the point. I saw this with SOA, REST, Agile and now DevOps is happening too.

Yes i will say one more time that the DevOps team is wrong. Is so wrong, is not just a name and is not just a matter of practices.

More and more a see what the it industry got from DevOps is CLOUD and Automation - witch is great because this a very important aspects of devops but however devops is way more than that.

The confusion a SEE is calling OPS -> DevOps, OPS is OPS, OPS is not DevOps. You have Dev in your company a most likely have a ITIL shared OPS in your company so lets say you have 100 developers mostly you have 20 DBAs.

Cloud and Automation => Deploys

Yes Deploys matters but is not only about that. I`m not saying automation is easy in fact is hard and takes lots of time and hard work - thats might be a reason why see so much devops teams or devops people or devops engineers. Because we have a very specialized work to get done around cloud and automation and people(developers) are too busy coding they cant afford stop so what people do? Get a DevOps team to carry all automation and cloud work.

The main problem this is creates is you just created a SILO and now this silo is not called OPS is called DevOps, Whats the difference from this SILO to your old OPS doing shared ITIL and lots of process and slow deploys? Well of course automation and cloud have value but this just means you can do better OPS it does not means you are doing DevOps. When you got specialized - Certifications are the next step and this already start happening.

Better and modern OPS is very important dont get me wrong, we all need Agile Operations and Cloud and Immutable Infrastructure and Discoverability and Centralized Logging and So many other important aspects.

The Issues with SILOs?

SILOs are very anti-lean idea. Often they are full of waste because of each silo has his owen set of priorities and goals not to mention classical lean wastes like hand offs, delays, bottlenecks, motion, extra steps, and so on and on... DevOps should be driven by Lean principles and thats a great reason to not do a silo. The main issues is all companies what benefits but they really dont want to HARD changes well guess what? No Pain No Gain. Our industry is not ready to DevOps. In other hand i dont think we was ready for agile or soa, why it get it all wrong always? Lots of companies are moved by Hypes or gartners charts. Several times this kinda of hype goto a kinda of standard Strategics planing and become a KPI them people need do something. DevOps or Agile or SOA or Scrum should never be Strategic Goals - Make you business better should be a reality to live by everyday. People have the vision that if you put something as an Strategic Goals magic happens actually thats not true - most of times this is like a game and when you have a game cheating is built in feature.

Having a clear and right vision is everything - this is so hard and so few people get it right. That`s why is so hard and that will dont stop until we fix the right root causes deep down to the people who make calls or lead.

DevOps is About Anti-fragility

Whats is anti-fragility ? It is better Software. You start doing all sets of new aspects about your development and operation that you never did it before like:
  * Stress Testing
  * Caos Testing
  * Failure Injection Testing
  * A Service Always can recover from disters
  * Bugs or Failures dont tear down your service - how ever you can degrades the user experience
  * Fall back Mechanisms
  * Proper re-trys and Timeouts
  * Fail over / Dynamic Partitioning
  * Centralized Logging
  * Request control (know what users asked - when and how things blow)
  * Continuous Performance Improvement
  * Incident Training
  * Automated Roll backs
  * Proper Data Management - Automation on DB, CQRS, Compensation, etc...
  * Reactiveness
  * SOA / Microservices right principles and governance
  * Metrics, Scientific Approach to find and improve things
  * Better Data Centers, Internal PaaS and Mesos
  * Awesome Monitoring Proper Postmortems

You only can have that if you dev and ops work together looking for this aspects and Dev needs to know OPS and OPS need to know Dev, they really need to understand the services otherwise you are not doing devops. Easily you could be doing better OPS or modern ops with Automation and Cloud but todo DevOps you need Culture you need a team working together to make sure your software is anti-fragile.

Cheers,
Diego Pacheco



Thursday, October 23, 2014

Are we becoming Software Architects dinosaurs?

What is an architect? What it does? why do you need them btw? Thats really depends on what you belive and how to you see systems.

The IT Industry have some common ground ideas, but often ideas get mixed with different interpretations of the terns and practices.

There are company that say stuff like an Java Architect or .NET Architect. I think this is worng, most likely they are senior developers in java or .net or a architect that knows one of this languages a real architect know more than one language for me. So an Architect is an architect is not an Java Architect. If you just know java could you be consider architect? Today a solution could be using several different technologies and stacks, would a pure vendor/language solution be ideal?



What is the problem with shared words?

Architecture could mean one thing for one company and another for other, since IT is not something heavily regulated(i`m not complaining about that) same word like "arch" could have different meaning and different implications and skills sets. If you get a great set of engineers you really dont need architect as a central role, but that is something hard its not easy get awesome professionals now a day, actually is getting harder to hire good guys, is easier develop and help to grow people rather than just hire.

People see this in the market thats why some companies work with skills sets rather than roles and even with roles if you ask the market for arch people you will get the average of the market does for it, is that good hiring process? I thing a better hiring process is focus on ear intelligence, culture matching and potential to kick ass :-)

Kick Ass Engineer, Ninjas, Full Stack

I like this, because it make it way more explicit and avoid people do attract wrong skills sets, thats works great if you want a amazing professional, the problem again is the fact that this people is hard to get it, and you might get some people afraid since the guys could be a good developer but could not feel to be a ninja and he might not submit for the position because of what you asked.

In other side of the coin as a business model or operational differentiation this is great because you say explicit your level and you raise the bar, thats great for technical excellence and quality focus. In the end of the day is all about what you attract and what you want todo, whats is your vision of architecture.

My vision is that me and the group of people a know are becoming dinosaurs and we could get extinct. If you get very specialized into something you might not found may places you fit, even if you can adapt it does not mean you want to right?

The Gap


This is why, it happens. Most of "Architects" are in the opposite of this spectrum, most i see are seniors software engineers. As you stay at the same company people may want you focus on the business that you move you from solution to business and enterprise architect. There is some interesting skills like: prioritization, vision, leadership, talk to the business and talk to the IT guys but thats useful for huge companies. Spottily have a better way todo this breaking things into functional teams but this still a approach.

In the other side of the coin software companies what the guys(if not become managers) to be heavily technical and called architect but are they are really architects? Often they are not, they just are senior software engineers.

A Software architect become into the center of the middleman, it has skills to communicate with the business and can make power points but dont spend the whole day coding and configuring jars and frameworks but the guys think about the principles and the big picture but it also code the architecture.

Sizes

For me IMHO the write approach is have software architecture, have someone that could stay in the middle and code because code is what keeps you current and smart. but business skills are useful you need to be able to communicate with people and explain why they should go one one instead of another.

This will may very depending of the size of your company and how simple or complex things are, generaly speaking. Unfortunately this is getting extinguished since people grow at enterprise level and them get to away from the code, thats a natural process, i`m not saying is wrong, i`m just saying we are loosing important things.

Cheers

Chuyên mục văn hoá giải trí của VnExpress

.

© 2017 www.blogthuthuatwin10.com

Tầng 5, Tòa nhà FPT Cầu Giấy, phố Duy Tân, Phường Dịch Vọng Hậu, Quận Cầu Giấy, Hà Nội
Email: nguyenanhtuan2401@gmail.com
Điện thoại: 0908 562 750 ext 4548; Liên hệ quảng cáo: 4567.