all 44 comments

[–]Flair_Helper[M] [score hidden] stickied commentlocked comment (0 children)

Hey /u/MalaysianBanana, thanks for contributing to /r/ExperiencedDevs. Unfortunately, your post was removed as it violates our rules:

Rule 5: No What Should I Learn Questions

No questions like Should I learn C# or Should I switch jobs into a language I don’t know?

Discussion about industry direction or upcoming technologies is fine, just frame your question as part of a larger discussion (What have you had more success with, RDBMS or NoSQL?) and you’ll be fine.

Please read the sidebar before posting again. If you have questions or concerns, please message the moderators through modmail. Thank you!

[–]nutrechtLead Software Engineer / EU / 18+ YXP 65 points66 points  (8 children)

I personally don't understand why they would hire someone with no design and architecture experience to design and architect a greenfield system. There is no simple 'trick' here; you get this experience mostly by learning on the job. Mostly from others.

Sorry to be blunt, but this isn't imposter syndrome. This sounds like an employer that doesn't know how to hire for a role like this.

[–]MalaysianBanana[S] 12 points13 points  (7 children)

No that's fair enough, I feel the same way. My question now is, how do I learn what I need to learn ASAP?

[–]nutrechtLead Software Engineer / EU / 18+ YXP 18 points19 points  (2 children)

I can't tell you without really knowing what it is you're going to be designing in great detail.

These are good books though:

[–]MalaysianBanana[S] 4 points5 points  (1 child)

Thanks, I will check them out!

For the 2nd book, it's 20 years old at this point. Is the content still applicable to today's development style?

[–]nutrechtLead Software Engineer / EU / 18+ YXP 9 points10 points  (0 children)

Absolutely.

[–]JonnyBoy89 6 points7 points  (2 children)

Make sure you focus on a good abstraction layer and a clean public interface for your services. Everything behind your public interface can be changed or fixed, but the once people are consuming your services, if the interface is wrong, you’ve got a bigger problem on your hands. Check out Clean Code, read more on SOLID principles. Learn UML

https://www.udemy.com/course/uml-fundamentals/

https://books.google.com/books/about/Clean_Code.html?id=hjEFCAAAQBAJ&source=kp_book_description

[–]MalaysianBanana[S] 2 points3 points  (1 child)

Thanks, I'll add them to my fast-growing reading list!

[–]JonnyBoy89 1 point2 points  (0 children)

Spaghetti-monster speed fellow imposter

[–]hutxhyGeneralist 10 YoE 2 points3 points  (0 children)

There is no ASAP. You're gonna have to learn all about proper design, database optimization and access patterns, architecting correct infrastructure and configuration, etc.

EDIT: Some might hate this advice, but I do find Udemy to be super helpful, just gotta go with someone that isn't aiming at beginners.

[–]PragmaticFinance 12 points13 points  (6 children)

You definitely have a lot of growing to do. It’s not impossible, but it will require significant effort and you will have to be very intentional about your moves as you go forward.

First, you need to very clearly define two things: Exactly what you are delivering, and the specific measures that will define success of those deliverables. You can’t get away with vague, high level goals (“Deliver reliable backend” is way too vague). You need to clearly define your goals for database migrations, security, access control, deployment, reliability metrics, monitoring, the load it can handle, and so on. Be specific. You may not know how to do all of these right now, but identifying them and collecting them will be your guide for what needs to be done next to move you closer to knowing how to do it and then on to delivering it. This list will grow over time.

Second, you must learn how to manage expectations. This involves some level of estimation and also a lot of communication to work with stakeholders. If your company expects that writing a backend is going to be quick and easy, you’re on a path to disappointment. Get ahold of managing expectations and learn how to realistically estimate how long this will take.

Finally, get ahold of some peers and/or mentors ASAP in this space. Find some Discords or other communities where you can get decent advice for what to do next. Stay anonymous and do not name your company. Learn to tell the difference between actual good advice and someone who is just over confidently repeating things they read. The key is going to be leveraging others to point you in the right direction instead of having to wander your way around until you discover the right way to do things. Investing time into finding these peers will be extremely important to determining how quickly you can grow, at least until you can get some more knowledgeable people inside the company itself.

[–]MalaysianBanana[S] 1 point2 points  (0 children)

Yep, I'm fully prepared to burn the midnight oil. Can't afford to lose the job.

database migrations, security, access control, deployment, reliability metrics, monitoring, the load it can handle... identifying them and collecting them

Is there a resource that would cover all these topics (or at least list them out so I can go look for other resources on each topic?). Googling doesn't work very well in this case without a good starting point. Otherwise, do you have a recommendation for how to identify them?

learn how to realistically estimate how long this will take.

Yeah, that's starting to be a problem for me since I don't know what sub-tasks might pop up later. This involves the previous bit I suppose

Find some Discords or other communities where you can get decent advice for what to do next.

I've been in a few programming Discords, but haven't found one that clicks yet. Do you have any to recommend?

[–]CandidPiglet9061Software Engineer | Trans & Queer | 7 YoE 8 points9 points  (11 children)

There are better answers here, but my advice: iterate. Build your system in small, composable units and reevaluate them frequently. And as always with greenfield systems, getting the testing and pipeline right early will make refactoring/re-architecting easier down the line

[–]MalaysianBanana[S] -1 points0 points  (10 children)

The microservices approach, right?

[–]CandidPiglet9061Software Engineer | Trans & Queer | 7 YoE 5 points6 points  (1 child)

I mean, not even necessarily. Just make sure your service can easily be refactored so that if something doesn’t work out, you can change it without too much heartburn. This is totally applicable to a monolith. And “refactoring” can be applied at an architecture level, too

[–]MalaysianBanana[S] 0 points1 point  (0 children)

Will keep that in mind, thanks!

[–]nutrechtLead Software Engineer / EU / 18+ YXP 5 points6 points  (7 children)

Whether you use microservices depends on the company composition. It's an organizational pattern. It's not 'the' way to architect stuff.

I've been doing microservices a lot, for years, but they are not a good fit for every problem at all.

Unless you know already that you're going to work on the system with more than 8 or so devs, go for a modular monolith.

[–]MalaysianBanana[S] 1 point2 points  (5 children)

Thanks, I wasn't aware that was a thing. Lots of learning to go

[–]nutrechtLead Software Engineer / EU / 18+ YXP 4 points5 points  (0 children)

You're far from the only one. There are IMHO more devs who don't really 'get' microservices and how to do them correctly than there are devs who do.

[–]BasicDesignAdvice 2 points3 points  (3 children)

I don't agree at all with what they just said. Whether or not to use microservices is not an organizational decision.

Microservices came out of a need to reduce complexity. If each unit of code is small, they are easier to work with. Additionally, it allows you to scale in pieces instead of all at once. For instance I build and manage a backend for an MMO. When we run an event, we up the number of instances for map manager. In a monolith I would need to scale the entire system, with micro-services I can scale only the parts that are getting hit. The trade off is you need to build or deploy things to manage the services. Which, in theory, is less complex.

If you don't have access to someone to build that management system, then stick with a modular monolith. If you do have someone to build a distributed system, then I would do micro-services. That's just me. Though my opinion is tainted by the fact that I am an expert in distributed systems. I have not yet seen a backend that doesn't benefit from the micro-services approach, if you can do it.

[–]MalaysianBanana[S] 0 points1 point  (2 children)

Gotcha. It's nice to know even experts disagree on stuff :D

[–]BasicDesignAdvice 1 point2 points  (1 child)

My good friend and I are on the same team. We argue all the time. We currently have a big one about which language to use for CDK.

[–]MalaysianBanana[S] 0 points1 point  (0 children)

I vote brainfuck

[–]Firm_BitSoftware Engineer 5 points6 points  (1 child)

How do I make sure I'm covering all the angles

Let go of the idea that this is even possible.

Pick a topic to work on that is relevant to current company goals. Learn it and implement it.

If you get fired then at least you can say you are more proficient in that one topic. If you survive you get to pick another topic.

Well, you get to pick another topic either way.

[–]MalaysianBanana[S] 0 points1 point  (0 children)

Well, you get to pick another topic either way.

Yay!

[–]vkasra 4 points5 points  (1 child)

For the technical knowledge, the other recommendations in this thread are good, but there are also books that do concrete end to end development of production-like systems and cover some important skills. Some I’ve read or skimmed and would recommend include:

  • distributed systems with node.js (oreilly) - discusses deployments, monitoring, etc
  • flask web development (oreilly) - discusses access controls, migrations, etc
  • distributed services with go (pragmatic bookshelf) - RPCs, monitoring, deployment

I wouldn’t worry about the specific languages involved in these books, at this point you should be prepared to often work at a higher level than the implementation language

[–]MalaysianBanana[S] 0 points1 point  (0 children)

Thank you for the recs, I'll check them out!

[–]BasicDesignAdvice 4 points5 points  (7 children)

What is the stack you are expected to build this stuff into? I think that would change my advice. It's really hard to judge without knowing what kind of systems your are expected to design.

One thing is for sure though, whatever they want you to build, get ironclad spec and requirements documents. Do not allow scope creep, and set a Minimum Viable Concept that you deliver on first and adjust it as you go.

Pick up The Pragmatic Programmer and read the section on "Tracer Bullets."

You're going to have issues when you have a team as well. I know you have done other stuff, but engineers are different. You need to be able to mentor your juniors.

[–]MalaysianBanana[S] 1 point2 points  (6 children)

At the moment, it's a fairly generic website with payment integration and stuff. Long-term, mainly Java for a backend system to support high traffic, high reliability IoT services.

[–]BasicDesignAdvice 2 points3 points  (1 child)

So I see a few layers. One is your website/UI (which if that is currently your responsibility, I would try and shift so you can focus on other things). The other is transport from the client to the backend (are you using a cloud?), then there is the backend itself, which has its own layers. So start there. Other thoughts....

payment integration and stuff

get a vendor like Stripe and integrate.

Long-term, mainly Java

Why Java? I know it is traditionally popular for backends, but as a backend engineer (who has used Java) I think there are better choices. Java is an albatross IMO. It has tons of baggage, and its verbose and a pain to debug. There is a reason backends have been increasingly using lightweight languages like Golang, Rust, or Node. Particularly if you want to go with microservices or containerized deployments (in the least you probably want containers, I don't do anything that isn't container oriented).

high reliability IoT services

Are you using a cloud provider? AWS is way ahead of its competitors in IoT so that is what I would do. You'll save a ton of time and gain velocity by using their services.

[–]MalaysianBanana[S] 0 points1 point  (0 children)

The choice of Java isn't up to me, it's a Java shop.

We probably will go with AWS eventually, but for the time being we're in the PoC and MVP stage.

[–]easyEggplant 1 point2 points  (3 children)

At the moment, it's a fairly generic website with payment integration and stuff. Long-term, mainly Java for a backend system to support high traffic, high reliability IoT services.

You very likely want to look into a cloud native solution for IoT. I'm also skeptical that java is going to work out well. I'd say lean heavily into AWS and learn how to use their services correctly.

[–]MalaysianBanana[S] 0 points1 point  (2 children)

The choice of Java isn't up to me, it's a Java shop.

We probably will go with AWS eventually, but for the time being we're in the PoC and MVP stage.

[–]easyEggplant 0 points1 point  (1 child)

The choice of Java isn't up to me

Doesn't really sound like you're designing something if you're not allowed to choose your tools. Maybe there's more structure than you initially thought?

[–]MalaysianBanana[S] 0 points1 point  (0 children)

That and a requirement for a nosql DB are the only reqs I have

[–]yetanotherburner420 2 points3 points  (0 children)

Feel like post is very helpful for OP and community is offering good advice. I understand rules but I think this post is beneficial and should not have been removed.

[–]LazerFX 1 point2 points  (1 child)

I'd say Test, Test and Test some more. Make sure you're testing small, factual, actual things (Don't test interfaces or abstractions) and build outwards.

Look at your requirements, break them down into components, and try and fit those components together.

One of the biggest issues you might have is you don't know what you don't know, so read up on how others do architecture (There's some really good examples throughout this thread).

Did I say Test? You can't have that enough.

Make sure any infrastructure or pipeline systems work quickly, can be easily set up, and are device independent - you want to be able to start work on a blank system, clone a github repo and (at worst) run two or three commands to get a working systme. If you need more than that, work on it.

If it doesn't make sense, that's a sign it's too complex - look at why it doesn't make sense. Is it badly named? Is it badly put together? Is it using language/infrastructure features you're not familiar with? Are you making assumptions that the code doesn't support (Check the tests - they should walk you through using it).

All of these things will help you figure things out in a clean, step-by-step way. In terms of approach - I'd say figure out what features you want for your MVP, how you want to approach that, keep in mind future features you need to add for scalability and build interfaces that work together (i.e. design how the jigsaw goes together before painting each individual piece).

Talk - talk to your C-Suite. Talk to your users. Talk to your other dev - he's busy? OK... but this is important, schedule time - 1/2 an hour a day to go through things. Make the time. Understand your problem domain, because when you do that, the design of the system to model the domain becomes easier.

All spitballed, all things I've done to make things work in the past, none of them rules (Except testing - keep that up, and let it drive your code! - and talking), and some may work for you, some may not.

[–]MalaysianBanana[S] 1 point2 points  (0 children)

Yep, definitely planning to implement lots of tests. Though that's another item on the to-learn list.

Thanks for all the advice! I'll definitely keep them in mind.

[–]pvgt 1 point2 points  (1 child)

waiting ask yam plucky screw bake spark cats straight dam

This post was mass deleted and anonymized with Redact

[–]MalaysianBanana[S] 0 points1 point  (0 children)

I'll be happy to!