Is there any way to practice methodologies of software development?

Not to learn them reading a post here or there, but actually “practice them” as you would do with a language.

Everybody talks about mastering the following to be a succesful candidate for an interview:

-Front End

  • Back End
  • Algorithms
  • Soft Skills

etc…

But I yet haven´t seen any academy or youtube video that teaches you how to practice daily things such as:

  • Continuous Deployments (with Jenkins for example)
  • Archiquectures / Methodologies desings (such as Hexagonal architecture)
  • Testing

For example I have search some videos about testing but that hasn´t solved my doubts about how really testing is done on an app ready for production in a company.

Any help?

Your best bet is probably finding tutorials for how to set up a particular CI/CD configuration. It doesn’t really matter that much what specific technologies you choose to learn because the core principles and the general practice is the important thing. I know that GitHub and GitLab have really worked to steamline various devops integrations. One of the things you should be able to set up is automated test coverage reporting. This will tell you how much of your code is actually being exercised by tests. That can help you get a feel of " how really testing is done on an app ready for production in a company".

1 Like

Well to begin, CI/CD, Architecture, and even Testing are arguably not very entry level things. As far as testing goes Udacity has a pretty good course on it. Basically it comes down to what you’re building and the testing requirements for the company in question.

If you want to get good at testing, try and practice TDD (Test Driven Development). Basically you write a test, make it fail, then create the functionality that would make it pass and repeat.

1 Like

“Hexagonal architecture”? I can’t even… We used to just call that “loose coupling”.

The hexes do make for way cooler diagrams though.

2 Likes

Also, you can read books on Architecture and Design Patterns, but they really only become applicable by building things that would specifically call for them. Once you’ve done it enough you’ll recognize what works best for a given problem and then implement accordingly.

to be a succesful candidate for an interview

But I yet haven´t seen any academy or youtube video that teaches you how to practice daily things

There are a number of reasons why this might be true, but the biggest IMO is it’s just not as “cool” to learn this part of software engineering. Here are some examples you can start digging to go learn this stuff though

Continuous deployments

Check out https://docs.travis-ci.com/ . Combined with github you can set up a completely free and complete CI system for yourself.
Another well used alternative is Jenkins. I’ve used travis more recently, both are fine from what I remember.

Architecture and Methodologies

This one’s a bit tougher to find free info online for - partly because there aren’t too many people focused on these kinds of problems (relative to the number of people on stack overflow looking for “how do I do this?”), but also largely because the space isn’t settled yet. The architectures and methodologies being used at major companies today are literally being invented as they’re being used. Some crash and burn and some work well! Time will tell which are the good ones to be replicated.

These are also two different concepts. Architecture is more about how to put the software together - there are plenty of talks at conferences about this stuff, but here is one good resources that I’ve enjoyed: https://lethain.com/staff-plus-eng-resources/

Software Methodology tries to get at the problem of how to best organize the multiple individuals building the software. Basically it’s about project management and engineering management. As a developer, you generally learn what the team’s doing and follow the processes. If you go above and beyond and learn additional possibilities, you’ll impress the crap out of your manager(s). Or piss them off if they are shitty managers lol.

There aren’t many free resources online that I’ve found because it’s a fairly small subset of people that think about these things. Most of the info I’ve learned is in the form of books. For example, “High Output Management” by Andrew Grove is excellent. Beyond that, project or product management resources will be good as well.

Testing

Look up “testing frameworks [favorite language]” and “testing best practice” and you’ll find plenty of info.

Try googling around with a few of these keywords:

  • test driven development (tdd)
  • test mocks
  • unit testing
  • integration testing
  • e2e testing (end to end)

Also check out Selenium (try “selenium webdriver”). It’s the standard for automated browser testing, in addition to creating scripts with automate tasks that would otherwise require a human user at a browser.

More recently is chrome’s puppeteer if you’d like to compare an alternative.

how really testing is done on an app ready for production in a company.

Let me know if you’d like more detail about any specific part, but here’s the speedy version:

Manual testing

Individual developers should be responsible for manually testing any new changes they build, if that’s practical (UI changes, simple API changes, etc).

Unit testing

Developers are responsible for writing code that tests smaller components of the code base. For example, does the addTwoNumbers function add correctly? What if it’s a negative number? What if you pass in null. Does it correctly throw an exception if you accidentally pass in an object instead of a number? And so on. These things should be written alongside the code and automatically run (with the CI system!) when a change is submitted to the repository, and certainly before deployments (in a web based system).

Integration testing

Someone, usually a developer (sometimes an SDET for bigger teams), is responsible for writing integration tests. This assumes that all the individual components (functions, classes, etc) all do their jobs correctly individually, but an integration tests makes sure the subcomponents play well together.

End to end testing (aka E2E test, system test, and others)

Someone, usually an SDET in bigger teams, is responsible for automating user interactions with the overall system. This could mean writing some software to simulate clicking the “purchase” button on a website, and making sure they money flows through, and the product is marked for shipping (as an example).

Other stuff

Bigger companies will have a variety of other system in place, for example, Netflix engineering made popular the concept of their Chaos Monkey (google-able). This is software specially designed to go around and purposely disable random servers to see how the overall system would be effected. With much modern software being composed of micro-services that coordinate together, it’s essential that no single micro-service can take down the system. Each sub-system must be robust. This kind of testing checks for that in a controlled way.

Another major thing that isn’t discussed outside of professional environments is logging systems. How do you know what’s broken when it breaks? You can’t just look at the customer’s computer, so you need excellent logging systems, along with automatic metrics, dashboards, alerts, and alarms. These are all built into the professional systems.

At amazon, most teams are paged within 5 to 15 minutes of a failure of their system, and are expected to respond within 30 minutes. Much less for the bigger money systems.

This was longer than I intended, I hope it helps haha.

Feel free to let me know if I can clarify any of these, I know I rushed a bit.

5 Likes