Showing posts with label dev. Show all posts
Showing posts with label dev. Show all posts

Saturday, September 19, 2020

Dependency Management Best Practices

Every single technology project uses dependencies. No matter the language you use, you always will use dependencies. Monoliths and Monorepos make dependency management more manageable by having it all in the same place. Services and Microservices make them a bit more challenging because now they are spread across each server, updating libs is a challenge that requires automation to be fixed. Besides automation, some best practices are also needed. Several times engineering teams take dependency management for granted. After all, we are just adding some strings and numbers to a file, right? So how complicated can that get? Often dependency management issues only appear after time and scale. Dependency Management is a super important and relevant discipline. Today I want to share some best practices to make your life better and make sure you scale your codebase with speed and solid practices rather than piles of tech debt and pain. So In case your not geek enough, the post icon image is a famous Death Star for Star Wars, which also becomes popular by the Death Star diagram from microservice organizations like Amazon, Netflix, Twitter, and other companies. 

Dependency Management Best Practices

Often Best practices are depending on contexts. Once you have complexity several times, best practices do not necessarily translate from one company to another; however, there are cases where they apply and make sense, not always, but for Dependency management IMHO, these are Golden Rules and excellent practices to be followed. Here are some Dependency Management best practices: 

  • 1. Use a Dependency management tool (ant, maven, gradle). Do Explicit Dependency management.
  • 2. Use Artifact Management Solution (Nexus, Archiva, Artifactory) - Management but Mainly: Cache.
  • 3. Remove dependencies you dont use.
  • 4. Use Consistency Versioning (MAJOR, MINOR, SEC/PATCH).
  • 5. Do not use multi-project EXTERNAL POMS.
  • 6. Keep Dependencies up to Date (But does not update at deploy time - Immutable Infrastructure)
  • 7. Use Dependencies Carefully (Shared-Libs) avoid coupling as much as you can.

Dependency management is not only about using some specific or better tools. It's about a process and culture which requires attention and automation as well.  Let's do a deep dive into each of these practices and understand why they are important. 

Use the Dependency management tool (ant, maven, gradle). Do Explicit Dependency management.

It might sound obvious but it's not uncommon to see infrastructure projects downloading binaries manually and not using explicit dependency management via tools like Ant/ivy, Maven, and Gradle. No Matter the language you use, no matter if is an engineering or DevOps code, you should do explicit dependency management. Because is easier to maintain and we can relly on common process and tools for improvements and housekeeping. 

Explicit dependency management means, explicit defining dependencies on a file that is used by the dependency management tool. You should avoid having embedded dependency and scripts who download dependencies outside of your main tool. 

Use Artifact Management Solution (Nexus, Archiva, Artifactory) - Management but Mainly: Cache

Software tends to grow with your business. As you grew build times can get very slow. A cache is a must-have feature. Because there are multiple engineers downloading artifacts from the web and you often have multiple cloud environments like DEV, STAGING, STREE, PROD, etc... Dependency management solutions like Nexus, Archiva, Artifactory, also can help with better dependency management but one of the main benefits is to have a central cache and central repository management/location. 

Remove dependencies you dont use.

This might sound silly. But un-used dependencies are bad as Dead Code because they make upgrade efforts harder and they end up creating technical debt. It's not uncommon that dependencies have 3rd party dependencies too and you might be dependency from a 3rd party dep instead from a direct dep and have that scenario for a dep you dont use is bad. It's unclear, confusing, raise false positives, and makes reasoning about refactoring efforts much much harder. 

Use Consistency Versioning (MAJOR, MINOR, SEC/PATCH).

Versioning is something old as the snakes in the jungle(like we use to say in Brazil). However people still dont get it right. Why? People know when to use MAJOR(Major API Breaking change), Minor(Minor change no breaking backward compatibility), and Security/Patch release (minor bug fixe or security patch, not impact). But people do not do it. Why? Most of the time is a combination of lack of discipline and lack of ownership and pain of upgrading people dependencies. Central teams can be great in sense of reducing some costs but certainly, they hide some of the pains that if people would face them directly the would definitely deal with the problem differently.  Having consistent versioning is super important, for Design, for Testing, and for health engineering practice I would argue. This part requires discipline and every single binary should embrace this principle. 

Do not use multi-project EXTERNAL POMS.

Don't be fooled by the word POM. This principle works for any dependency management tool. You should not share multi-project external configs for dependency management. Either you have a monolith or monorepo where you have all code in one place or if you do have multiple github repositories you should not share these files(poms). Because? Well because they are EVIL. They create coupling they make upgrades harder and they kill microservices. 

If you will have shared libraries they should be:

 * Small

 * Independent 

 * Isolated (dont have poms, not share configs)

Otherwise, you will build a distributed monolith and binary coupling will prevent you from upgrade when you need it. Never trade coupling for convenience or developer experience.  However, if you have a monolith or a monorepo is perfectly fine to share poms. 

Keep Dependencies up to Date (But does not update at deploy time - Immutable Infrastructure)

Another super important practice is to keep your dependencies updates. Thats important for several reasons such as:

  * Prevent Bugs

  * Fix Security Bugs

  * Reduce Tech Debt

Update Dependencies often works with the same principles as Branches in Configuration Management. If you gonna have a long-lived branch(which you should avoid at all costs) you need to do merges every day so it reduces the complexity and issues on an old fashion bing bang boom merge. Libraries updates work in the same way. For minor, security patches, even minors should be able to upgrade it easily. 

DevOps has a principle called - Immutable Infrastructure, you do not want to upgrade libs before doing a deploys or when a service restart. Because that breaks the principle of immutable infrastructure. However, at the same time, you want to AUTOMATE your dependency management and update libs frequently. Often engineers do not have the mindset to keep updating libs, which can be fixed with proper plugins and automation. 

Use Dependencies Carefully (Shared-Libs) avoid coupling as much as you can.

When we ship internal shared libraries we need to be very careful. Shared Libs should be treated by applying the same principles we apply for Services. It's super important to pay extra attention to 3rd party deps in shared libs in order to avoid binary coupling. It's fine to use shared-libs, sometimes thats the right solution, however, there is a huge abuse of internal shared libs on the technology industry. 

Better Dependency management helps Design and Testing. It makes CI/CD more effective and in the long-run increases the speed and ability to ship better and more frequent software. Currently, we live in an era where every company is trying to do proper CI/CD, Observability, Services, DevOps, SRE, and many other important matters however we often forget dependency management is an important sub-part of Building that end ups charging a high price at scale. 

Cheers,

Diego Pacheco

Thursday, September 17, 2020

Github cli tool (gh)

gh is the new  Github command-line tool. I'm super excited about this new tool. It makes the engineers / devops engineer experience much better. It allows you to use github(not fully yet but the basics) in the command line, so you dont need to use the browser. GH is written in GO and I believe in the future we will have amazing tooling from Github to CI/CD using GitHub Actions. So let's get started.


The Video

The Instructions

Cheers,

Diego Pacheco

Wednesday, September 16, 2020

JDK 15


Java is finally getting interesting again since JDK 8 thats the first time I wish to be using a new JDK in production. I'm really looking forward to JDK 16 and to the future. JDK 15 has lots of interesting things such as Records, Pattern Matching for instanceof, EdDSA algo, Text Blocks, Local classes and interfaces, Sealed classes and interfaces, ZGC, FMA, and much more.  So Let's get started and take a look at a quick video I made to show Java 15 working with Maven and Idea. 



The Video

The Code

https://github.com/diegopacheco/java-pocs/tree/master/pocs/java-15-fun

Cheers,

Diego Pacheco

Tuesday, August 25, 2020

BFF Dilemma

The software industry is always becoming more specialized. We have backend engineers, frontend engineers, edge engineers, cloud/DevOps engineers and I'm sure we will have more specialization in the future. With specialization and growth on systems, we end up having more layers or places that we can put software. Microservices often end up making a huge proliferation of services at the backend(check out Uber case for that).  There are so many places that you can "put" your software but one particular place that is growing a lot is the BFF(Backend for Frontend) place. Often we have different stacks for backend and frontend. Frontend often is on JavaScript or TypeScript. Backend is often in Java, .NET or Go. So the first dilemma is, is BFF a frontend thing or a backend thing? IMHO it's a frontend thing where frontend means consumer. So how different BFF is from a driver or client? Well if you look into drivers and clients they often dont have network logic like routing, discoverability, circuit breaking where BFFs often dont. There is nothing preventing you put that logic on the BFF which really raises the question of how different BFF is from drivers/clients. Definitely, there is an overlap with Drivers/Clients/BFFs and even Services. 

BFFs the Benefits

Let's say you have a big app or multiple apps with multiple platforms like IoS and Android. Let's say you also have multiple sites or web application, it will be common to have a design system where you company want to have a standard view of the brand experience(colors, fonts, tons, etc...). It's important to leverage components, if you are working with React thats even easier and natural. However, another dilemma that often happens is, should I make a design system component, or thats something just for the app? Well, that is a couple of factors that could help you to figure it out. 

* How many apps/sites will have that feature/component? 

* How often that behavior it's likely to change? 

* How complex is to make the component? 

Even if you decide to go one route vs another route you can always refactor. So refactorings are cheap others are not, so as you grow you need to keep asking these questions. But regardless of what kind of component you end up doing or not doing you have benefits on the BFFs like:

* Caching 

* Sever Side Rendering - Which also can be done in a generic way. 

* Centralize and Re-use UI Logic (not business logic)

However, sometimes the UI Logic can easily be seen as business logic, in some sense microservices are making this much worst them it is.

Microservices are making BFFs Fat

I remember first waves of SOA where the default was to write code on the service, the services end up being FAT and with stuff that supposes not to be there. However, I also remember we having Aggregation Services, which were services that call other services and that was like the Gateway Uber is talking about on the re-discover of DDD post on DOMA. 

Right now we have a different default, meaning, do not put stuff on the service, they need to be micro. The consequence is that complexity is pulled upwards. Complexity needs to live somewhere and microservices right now tend to be super simple and small however all the orchestration/choreography is being done by the BFFs which are getting more fat and complex. 

It's a Governance Problem

IMHO we need Services, not Microservices. Services should be a bit more FAT. It's fine if the BFF is also FAT as long as it makes sense. So we are talking about a governance problem, that we need to answer some of the following questions:

 * Where we put our code? (BFF, Aggregator Service / Gateway, Service)? 

 * Are the decisions we made on the past still make sense? 

 * Are we running joint Event-Storming exercises to figure out boundaries? 

 * How do we version APIs? Do we provide forward and backward compatibility? for how long?

 * How we expose APIs? HTTP/2, gRPC? 

 *How own what component? 

 *How we test things properly? Are we having WASTE on our tests? 

 *How we coordinate cross-team efforts? 

 *Do we create a lib instead? Sidecar? 

It's also a management problem

There are lots of options to manage this kind of cross-coordination. Do we have a big team as just have a big kanban to handle it? Do we have a chapters/guild(Spotify) to take care of that? Do we have a small pizza team(amazon) to execute the changes? Amazon's way relies on autonomy as a business construct and lean way it kind of makes a lot of sense because of the dependencies and lack of business autonomy you might end up here. When I say business autonomy I dont mean if you company has a cool culture and people are allowed to experiment and do stuff. I mean autonomy is a business construct, so you need to be able to generate results by ourself otherwise you always will have dependencies and you might be better served by the lean model. 

Guidelines and Reflection Over Rules

Rules should be avoided because like any Design and Architecture matter we need to apply judgment. There is no one size fits all, so thats why rules are complicated. Judgment might be right or wrong or it might be right for a period of time and them things change and it's not valid anymore. For all those reasons we need continuous reflection, via big long retrospectives and working groups. Dilemmas are not bad, they are good actually it forces us to think which is our job. If we are not thinking a lot we might be following things we dont understand and creating debt and problems for the future :-) 

Guidelines are awesome because they are not hard rules, you should have very few hard rules in a sense of design and architecture. Guidelines are educative and teach people how to approach problems. One thing I use a lot with Guidelines is Principles, I love principles they are great and I few the industry needs to use them more. 

Cheers,

Diego Pacheco


Sunday, August 2, 2020

Java Object Creation Patterns

Java is an old language. 25 years now. Java has several limitations and issues however java is the robust and pretty well-stablished solution for backend, databases, Caches, Search Engineers,  IoT, and much more. Today I want to share some patterns about object creation. I highly recommend you read Effective Java book, which was a huge inspiration for this blog post. So I want to show you guys some useful patterns like Static Factories, Builder, Singletons and Immutable Objects.  So I made a quick video with code, let's get started. 



Video


Code


Cheers,
Diego Pacheco

Monday, July 27, 2020

Quarkus with Panache

Quarkus is a super interesting project.  IMHO Quarkus is JEE done right. It's super-fast, relies on Netty, uses GraalVM. Today I want to share a video I made about Quarkus with Panache using the Postgres database running on Docker. So Let's get started. 






Video


Code


Cheers,
Diego Pacheco

Spring-Boot-2 with Kotlin

Kotlin is a Jetbrains language that has lots of inspiration from Scala. Spring-boot-2 is a popular solution for microservices like Quarkus and Micronaut. Today I want to share a simple video I made so you can get started with Maven, Spring-Boot-2, and Kotlin. If you are new to Kotlin I also recommend seeing my previous post about the language. Okay, let's get started. 





Video


Code


Cheers,
Diego Pacheco

Kotlin 101

Kotlin is a JVM language created by JetBrains in 2011. Google declared the official preferred language for Android in 2019. Kotkin is heavily inspired in Scala. Kotlin claims to have the good parts of scala without having the bad parts. It's also possible to see some Python and Groovy influence as well. Kotlin makes java much less verbose and has awesome support in sense of IDE thanks to IntelliJ. I'm a Scala guy and prefer scala, however, kotling is an interesting choice especially if you are making android native apps. So today I want to share a video I made with a good walkthrough through several features of the language in a Maven project. So Let's get started!

Video


Code


Cheers,
Diego Pacheco

Friday, July 24, 2020

Immutables Builders

Fluent Interfaces(Internal DSL) are a nice and sweet way to code. However, make a builder in Java all the time can be a bit verbose and time-consuming. Immutables Builders is a very interesting library that can help us with the heavy lifting.  Immutables can generate builders which are Type-safe, null-safe, and thread-safe. They are super easy to use and serialization ready. Immutables make your code clean and fun. So today I want to share a java video made about Immutables Fluent DSL in Action. So Let's get started. 






Video


Code


Cheers,
Diego Pacheco

Swagger + Spring Boot 2

Swagger is a great API documentation tool. Today I will show how we can generate Swagger Documentation based on a Spring-Boot-2 Application. We will be using SpringFox. Swagger is interesting because you have a very useful contract for services/microservices. It's possible to generate code from that spec and also invoke the services. Spring-Boot is a popular java framework for services/microservices the integration between to solution is more than ideal and SpringFox does that for us effortless. So Let's get started!








Video


Code


Cheers,
Diego Pacheco

Monday, June 8, 2020

Linux Terminal Goods IV

Every software, DevOps, architect, QA engineer loves terminal applications. Console applications make uses more productive than GUI ones. One big important aspect of console/terminal application is the fact that they are scriptable and can be orchestrated with other automation solutions. This post is the sequence of the saga Linux Terminal Goods, If you did not check out previous posts you can do it here: Episodes I, II and III. I don't know if you realize but most of new and cool Linux console apps are written in Rust now a days.  So Let's get started.





fd


fd is a simple, fast, user-friendly alternative to find.



sd


sd is a intuitive, find and replace, similar to sed but much better.



tokei

tokei allow you to count your lines of code(Loc) pretty easily.



ytop

ytop is a like htop but much better.



git-fuzzy

git-fuzzy is really cool. Basically they enhanced git experience using fzf.

git fuzzy status


git fuzzy log


I hope you like it.

Cheers,
Diego Pacheco

Tuesday, May 19, 2020

There is no one size fits all

Everybody knows there is no Silver Bullet. We all know there is no one size fits all, however, we still look for it. It happened over and over and for sure will keep happening. Before when there was SOA, people were doing SOA wrong and want to fix all problems with ESB. So there was the SOA Rest Guerilla movement; Let's stop adding things on ESBs and move all to services. Now everybody has coded into microservices, they have distributed monolith in most cases and people are considering removing things from microservices and moving to Kubernetes. Why just run stateless code there right? If we can run all the things there like stateful databases, IoT/Edge, BFF, ML. However, there are other computing models. Most of the couples have Virtualization(EC2 on AWS), Containers (ECS/EKS on aws), Edge(Lambda on Edge for AWS), Serverless(AWs Lambda).

The history repeats: Over and Over again

There are workloads that could fit well on kubernetes others don't. There will be always use cases that will change drastically at scale and there all sorts of different problems and requirements. A long time ago there were JEE(Java Enterprise Edition - also called J2EE back on the days) people did the same mistake lets run all the things there. As you can see, we always know that there is no silver bullet but we still are looking for it. So At the end of the day, it's about balance. We still did not get this lesson as the IT industry. Distributed systems imply that there is no single system.  No Single runtime time, No Single box to add all the stuff. Some problems can be fixed at the platform level with Kubernetes / Istio. However not all the things run on Kubernetes and they should not all run over there. Lyft Envoy is growing a lot on mobile(proxy/lb). There is a need for more distribution with frontend(runs on people browsers), Mobile (runs on people cellphone), Edges Computing(Runs close to people locations for latency reasons). For operations, it is much easier to run all the things in one place. However, this is much more limiting. So If technology is changing and these are the same issues, why they keep coming?

People Problems

Often people consider this "one size fits all" issue a technical problem. We are in 2020, I dont think thats the case anymore. IMHO it's all people's problems, for different reasons we might get different problems but the common denominator is people. IMHO the forces which make this problem happens are:

1. Technology is not about sports: People end up supporting technology like they support football/basketball teams. We cannot provide unconditional love to technology because it blinds us. Technology should serve us not the other way around. Every 5-10 years everything changes. So there is no sense in having unconditional love and basis for temporary tech. Most of the tech is temporary.

2. Lack of Architecture / Design Skills: Lots of companies consider to have an "Architect" a dysfunctional thing. Because you have a team, the team can take care of the architecture, right? If you have a great talent pool maybe but in practice even with great talent pool there are still very poor decisions in a sense of design and architecture.  Because it requires thinking, compiling, and deliver code into production is great however it does not guarantee great design/architecture in the long run.

3. Lack of talent shape decisions: Management often gets afraid of engineers doing some activities, which makes a sociological effect of moving too many things to architecture/infrastructure and components that should not be there end up there because of the talent concentration in DevOps, Architecture and infrastructure teams.

4. There is no Turning back effect: Software allows change. Even poorly architected and poorly designed. However, it's very hard for management or business to pay the price of refactoring. For service industry projects often ends after you deliver them in production. For product companies, there is always a bigger priority so things get "final" and "fixed" easier than you think.

5. Knowledge gravitates towards people to companies: There is no such thing and "company" knowledge. There is only people's knowledge. IF you can retain and attract amazing talent with Architecture / Design skills the problems will keep happening over and over. Even worse because your company anti-buddies will fight "different" ideas for lots of the wrong reasons like Fear, Job Security, Ignorance, Power, etc. Some companies are worried about losing talent but they are no worries with the "debt people" they are keeping. Great people end up leaving, sooner or later with makes the problem keep happening.

The bottom line

In my previous blog post, I was talking about the Death of the microservices due to the rise of distributed monoliths. You might be wondering that this is 2 completely different subjects right? Wrong. It's all the same thing. IF we are doing wrong by moving all the code to shared-libs by side-effect creating a distributed-monolith and killing microservices. The solution cannot be "move all the things to Kubernetes or Platform" because we will have the same issue.

Lack of talent and education are shaping our bad decisions. Principles are more important then ever, however, if you dont have enough people who care about it and execute than well. You won't get a proper architecture and will fail by coupling one way or another.


Monday, May 18, 2020

Refactoring to Optional

When we right software we need to worry about so many things. For instance: Performance, Scalability, Security, and many other important concerns. There is also a need to worry about corner cases, error paths, and conde readability from other engineers. Which is not an easy task. So should we return null or not? Should we throw an exception or not? Null is considered to be a Billion of dollars mistake. Languages have some concepts to help us like Haskell has the Maybe Monad. Scala has Option. Rust has Result. Java has Optional. Since version 8, Java improved a lot and there is still a long head ahead but slowly getting there. Today I decided to do something different with you guys, let's do a simple refactoring together in order to improve our code and understanding. So there is a video showing from zero to a hero like code step-by-step. This is the first refactoring video I make, hopefully, it will be interesting for you guys. Without further due, let's get started! 


Video




Full code here on my github.

Cheers,
Diego Pacheco

Monday, May 11, 2020

DevSecOps: Are we reducing silos now?

DevOps, as movement and set of principles, did a great job making Operations and development the same integrated thing pretty much. However, industry-wide implementations are not quite there. There is an overlap with SRE(Site Reliability Engineering), and quickly you find DevOps Engineerings, DevOps Architects, DevOps Directors, DevOps Managers. There are plenty of DevOps departments out there. The same noise happened with Agile, where the company structures do not change, and silos still exist. Now we are about to extend the reach of DevOps to Security. Belive me of not the naming does not bother me much. There is a DevSecOps manifesto.

DevSecOps Manifesto

Leaning in over Always Saying "No"
Data & Security Science over Fear, Uncertainty, and Doubt
Open Contribution & Collaboration over Security-Only Requirements
Consumable Security Services with APIs over Mandated Security Controls & Paperwork
Business Driven Security Scores over Rubber Stamp Security
Red & Blue Team Exploit Testing over Relying on Scans & Theoretical Vulnerabilities
24x7 Proactive Security Monitoring over Reacting after being Informed of an Incident
Shared Threat Intelligence over Keeping Info to Ourselves
Compliance Operations over Clipboards & Checklists


DevSecOps make sense; There are lots of exciting and sensible principles there. We need to work closely with security and improve things; however, I want to point out other aspects and challenges here. 

The issues we need to consider are:
  1. Principles do not matter effect.
  2. What happens with the pre-requisites? 
  3. What happens for low-regulated industries and companies? 
  4. Is DevSecOps really about security? 
  5. Are we reducing silos and making organizational changes now?

So Let's get started and go aspect by aspect, down to the rabbit hole. Sorry to disappoint you if you thought this would be a security-related post.

1. Principles do not matter effect

Pop Quiz! What Agile, Lean, SOA, Microservices, DevOps have in common? 

A) All Buzzwords people dont understand but say they do it.
B) You say you want to do it, but you do not know what it means.
C) Last +10 years of hype-cycles? 
D) All the above

Albert Einstein once said, "I don't need to know how to answer the sum of two numbers, but how the sum principle works." That's the issue. We have this action about tools and processes, and we forget the principles. We applied some principles as before as still call our selves agile, lean, DevOps, Microservice, DevOps, and now we have DevSecOps to add.

2. What happens with the pre-requisites? 

Another question. Can we implement DecSecOps ops without implementation DevOps properly? Can we implement DevOps properly without implementing Agile properly? Can we implement DevOps properly without Microservices? Can we deploy Microservices properly before knowing SOA? One movement is evolution and input into the next move, sure. But is all about evolution? Are we missing something big here? 

Do we have any pre-requisite to doing DevSecOps? I always see DevSecOps material related to CI/CD and Microservices. Can we reduce the attacker blast radius with a monolith application and globally shared database across all the monoliths? 

3. What's happens for low-regulated industries and companies? 

So IMHO, DevSecOps is not only about high-regulated industries that need to deal with PII data like ensure-tech, fin-tech, banks, and such. Like Vogels said once recently, "Everybody needs to be a security expert now." IF you have a digital product you need to worry about security, Data Breaches are more popular than ever, and deftly could kill your brand and user experience. Unfortunately, what happens is that security is often the last thing that people care about it. There was a time that Tests was the last thing to be done in a project, now is security. 

4. Is DevSecOps really about security? 

Yes, but not limited. It's also about proper architecture, cloud engineering, DevOps, Agile, and several other things. Might you say I dont need to worry about anything I can focus just on security? So how do we?

  1. Deploy security patches to all machines, services without downtimes?
  2. How we Update configurations at runtime without downtime at the massive number of microservices? 
  3. How do we reduce the attacker and reliability Blast radius? Are they opposite after all? 
  4. How do we rotate Kubernetes Cluster Keys? Can we turn that keys? Are we using HTTPS? How do we know all this?
  5. How do we validate best practices at scale? Do we need to change the Build process, or we do all manually? 

Quickly all these questions should require infrastructure, automation, and architecture around lots of non-security related topics like CI/CD, Automation, Observability, Better Deploy Pipelines, Dynamic Configuration Systems, Discovery, Automated Remediations and much more.

5. Are we reducing silos and making organizational changes now?

So this is the big question right. Are we going to continue to do the same security anti-patterns like store passwords in github? Store credentials in the EC2 machines instead of a Secrets Manager like Vault? Do JDBC SQL code without Proper Binding and allow SQL-Injection? After all and declare victory and say we are doing "DevSecOps." The whole industry needs to LEARN and need to change. Both things are hard, but at some point, things need to change. 

Cheers,
Diego Pacheco

Saturday, May 9, 2020

Education vs. Learning

People asked me, what do you think about university and education, how do we know what we should learn and how to prioritize our studies? All valid and taught questions. For most Brazilians, the university does not make sense. I get it why, because when you join the workforce, you see very few usages for the skills or subjects you were looking at university. So I believe there is a list of 5 essential aspects you need to consider before deciding to drop out(IMHO you should not drop out). So what are five elements I'm talking about:
  • What is your goal?
  • What makes you happy? Where do you want to go?
  • Short vs. Long term
  • No Boddy knows the future.
  • Education vs. Learning
Let's go trought them one by one. But before I went there, you need to keep in mind that this is your life, it's your call and ownership at the end of the day, beware that nobody can answer this questions to you. Coaching and mentorship can deftly help you as you are starting your career or just pivoting or even just looking for advice. However, it is essential to keep in mind that mistakes are part of the process; there is no way you get a perfect moonshot with no errors after all mistakes are part of the learning path.

What is your goal?

For the software industry, this is a complicated question. Quickly we could say there are two paths (management and technical) however is not that simple. There are so many more branches like in a managerial way: you could go as Engineering manager(close to the tech and agile part), or you could choose the product-driven path with means working with experiments, discovery, UX, business analysis, etc..  
For an engineering path, there two significant segments, being a specialist(Cloud, DevOps, Architecture, Data, Frontend) or being a Generalist know a bit of everything. It's impossible to know everything; you need yo choose where do you want to land. So knowing whats is your goal will help a lot to focus and prioritize your studies. The big issue might be you dont know where you want to land or you might not have the opportunity to get there yet. 

What makes you happy? Where do you want to go?

IMHO that's what matters most. If you care about what you do - taking computer science, the course is useful because you will teach you how to do research and the long term will pay off. JavaScript frameworks pop up much faster than formal education can keep up, so comparing what you are learning in academia with your work needs are not precisely apples-to-apples comparison. Dropping out is fine if that is what makes you happy, but as you are young, I would say you don't do it; you might regret the future. So there is no right or wrong, and you need to be asking your self, where you want to be, another essential thing to keep in mind is, are you too anxious? 

Short vs. Long term

IMHO education(academia) is about the long term is not about a short time. Most of the time, I believe people want results with zero or few-investment. So you need to acknowledge that what you are doing know might change, and you might change your opinion and things you like you might stop linking it - that might happen a lot. For instance, I use to like Scrum, and I don't like it anymore. I use to like Clean Code, and I don't like it anymore. So as my experiences happened, my opinion changed, which is all fine. Short term learning is needed. Often in a project, you might need to learn a new language and a new library. However, at the long term game, there are things(will improve and change) but will be less volatile like sloid computer science 101 things(which you learn in academia) like Algorithms, Data Structures, Formalism, Distributed systems. So I always worked with the Deep and Breath study model, where 80% of my studies are long term, and 20% of them are for a short time. 

You cannot learn everything; our time is limited. So that I would say it is super important to limit your WIP. It's the internet, twitter, your friends dictating and controlling your study plan, or is you on that control? Great stuff only comes from long term study. 

No Boddy knows the future.

Things change, and technology changes; you might invest hours and hours in this that die. That happens, it's not a problem. So again, I believe what matters is to learn more about your self. What do you want? Use cool bleeding-edge stuff, or do you want solid background CS skills? I would say both works very well. I would say always know the tools you use most of the time and prioritize long term skills. 

Education vs. Learning

IMHO formal education and learning are entirely different things. Formal education is essential for you too, but it is not enough. Technology is about continuous learning, and you need to learn how to learn—starting by controlling the anxiety and letting it go(the control - nobody controls anything) and enjoying the journey. Again, no significant results come from short term investment. Do not worry too much about what you are doing now; it's more important to have the mindset rather than the right outcome; direction is more important than speed. 

IMHO books, papers, blogging about help a lot, but this is my way, it is no right or wrong, so you need to find your style and understand how you learn, some people work well with papers, others dont. Just keep in mind there can be tweaks and ways to change things -- try to take judgment too fast. 

Cheers,
Diego Pacheco

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.