 Di sini adalah definisi. Sistem kompleks adalah dibina dari bahagian yang lebih mudah. Sudah tentu ia adalah. Dan semua orang-orang itu adalah komuniti orang-orang dari sistem kompleks. Dan orang-orang itu mempunyai prosesi dan output. Kita mempunyai 5 senjata. Prosesi kita adalah brains kita. Dan brains kita beritahu apakah sesuatu... pizza ini berfungsi atau berfungsi. Ia adalah engine kelasi. Ia adalah kelasi. Berfungsi atau berfungsi. Jadi... sistem kompleks juga mempunyai prosesi dan output. Prosesi untuk sistem manusia sekarang adalah hubungan interpersonal dan hubungan. Saya seorang kawan, saya seorang pengen, saya seorang penerbangan. Dan prosesi sekarang adalah menghidupkan kelasi, prosesi dan norman kultur. Jadi... kultur, komuniti mempunyai prosesi itu. Dan outputnya adalah komuniti yang mempunyai kamu. Komuniti yang mempunyai kamu atau mempunyai kamu. Jadi prosesi kamu berubah, atau tidak. Jadi itu adalah sistem manusia. Bagaimana tentang sistem manusia? Jadi disini adalah contoh seorang pekerja yang muda. Saya memilih perkataan seperti pekerja. Bukan komponen. Ia adalah pekerja. Saya akan membuatnya sangat peribadi. Ia adalah pekerja. Dan pekerja ini, apa yang dia lakukan, adalah menghidupkan segala-galanya. Bukan hal yang besar. Tetapi... ada beberapa perkara yang kita boleh katakan tentang pekerja ini. Pekerja ini menghidupkan seorang pekerja. Jadi dalam kultur, kita perlu bercakap tentang bahan-bahan. Dalam software, kita juga akan bercakap tentang bahan-bahan. Jadi pekerja ini tahu bagaimana untuk menghidupkan seorang pekerja yang berjaya, dan dia panggil seorang pekerja yang berjaya untuk menghidupkan dunia. Dan pekerja ini adalah seorang pekerja. Sekarang, Singapura adalah sebahagian seorang pekerja, seorang pekerja yang berjaya. Yang terbaik yang berjaya diberi kepada kita adalah pekerjaan. Ia adalah penjaga yang hebat untuk masa yang stabil. Sekarang, masa yang tidak stabil, pekerjaan tidak menyebabkan dengan baik. Tetapi apabila masa yang stabil, ada perkara di dalam pekerjaan. Ada orang di dalam pekerjaan yang disebut adalah pekerjaan. Dan apa yang pekerjaan buat? Semua pekerjaan tahu bagaimana untuk menghidupkan bahan. Dia tahu bagaimana untuk membaca dan menulis. Dia tahu bagaimana untuk memperkenalkan aromatik. Dan dia dapat memperkenalkan banyak fungsi dalam pekerjaan. Ia adalah seorang yang memperkenalkan kemahiran dan kematian. Ia adalah seorang yang memperkenalkan kemahiran Ia adalah seorang yang memperkenalkan kemahiran. Jadi, pekerjaan penjaga yang berjaya adalah sebuah perkara yang hebat dalam perjalanan stabil. Dan mereka adalah pekerjaan yang dikenalkan yang diperkenalkan. Sangat mudah diperkenalkan. Dengan seseorang yang boleh membaca dan menulis bahasa Inggeris dan sebuah aromatik. Sekarang, mari kita bercakap tentang konteks software. Sistem software kompleks yang juga dibuat dari bahagian yang lebih mudah. Saya memutuskan untuk menghidupkan pekerjaan software. Dan pekerjaan software ini berbicara dengan pekerjaan software lain. Kita hanya bercakap tentang dua pekerjaan software di dalam akal. Dan sistem ini mempunyai kebenaran dan kebenaran. Apa kebenaran? Sistem yang diperkenalkan. Jika semua sistem berbicara dengan pekerjaan dan seseorang mahu bercakap dengan Java. Adakah persenjataan jawa yang terbaik? Bukan dalam monolith, tetapi dalam channel GRPC mungkin. Bagaimanapun. Jika sistem mempunyai kebenaran RPC dan pekerjaan lain mahu bercakap. Adakah pekerjaan lain terbaik? Tidak. Jadi sistemnya mempunyai kebenaran dan kebenaran. Jika saya mahu membuatnya seperti konteks manusia, entremophah adalah ia mempunyai kebenaran. Sistemnya mempunyai kebenaran. Kita menerima kebenaran ke dalam sistemnya. Dan sistemnya mempunyai kebenaran. Sistem akan mempunyai kebenaran atau lebih terbaik sebagai keputusan pekerjaan software. Pertanyaan yang penting adalah komuniti yang mempunyai kebenaran kebenaran. Jika anda dalam komuniti manusia dan membuat baik, anda akan mempromosikan. Jika anda dalam komuniti manusia dan anda tidak membuat baik, komuniti akan memastikan anda dan mempunyai anda. Komuniti software tidak membuat itu, hanya mempunyai kebenaran. Sistem tidak mempunyai kebenaran pekerjaan software. Jika anda mempunyai kebenaran kebenaran pekerjaan software? Sebenarnya seorang desainer. Sebelum kita bercakap tentang desainer dan kebenaran. Kita bercakap tentang kebenaran pekerjaan software. Dan kebenaran pekerjaan software adalah orang yang menggunakan library kebenaran. Dalam kebenaran kebenaran, kadang-kadang orang menyebabkan kebenaran kebenaran. Tetapi, library kebenaran hanya dapat membuat begitu banyak. Jadi, bagaimana dengan kebenaran kebenaran? Ketua-kita, kebenaran kebenaran, library kebenaran tidak memutuskan. Jadi, saya akan membuat kebenaran yang baru yang digunakan oleh penyelamat. Kerana saya penyelamat, kebenaran kebenaran ini membuat kebenaran kebenaran. Dan ada dua fungsi terlalu eksposed. Fungus kebenaran. Kita tahu fungsi terlalu kebenaran kerana mereka memulangkan kebenaran. Bersihkan kebenaran dan membuat kebenaran. Penyelamat membuat kebenaran dan membuat kebenaran. Dan mereka tidak membuat kebenaran. Semuanya membuat kebenaran yang saya membuat kebenaran yang panjang dan memasukkan kebenaran dengan banyak meter sekitar. Tetapi, ini adalah kebenaran yang menarik. Ia membuat kebenaran, kebenaran yang ditangkapkan oleh penyelamat. Dan ia memasukkan cara, memasukkan cara dalam bagi kebenaran yang berguna dalam kebenaran seperti itu. Jadi, penyelamat yang dapat membuat kebenaran memiliki kebenaran yang telah dibuat. Jadi, penyelamat, mengenai bagaimana kata-kata sayang undang menggunakan penyelamat dan mengenai bagaimana kata-kata sayang undang. Jadi, ia menjadi mempromosikan kepada pekerjaan luar. Ia adalah penyelamat protokol. Penyelamat pekerjaan luar. Ia mengenai bagaimana kata-kata sayang undang dan kata-kata sayang undang untuk mempunyai kebenaran. Tetapi, dia seorang kontributera yang sederhana untuk memasukkan dengan sesiapa yang boleh membaca bahan yang diberi yang boleh mengerti penyelamat. Kata-kata sayang undang dan selamat. Sangat mudah untuk digunakan. Bekerja khas untuk digunakan. Kerana anda sekarang perlu menghubungi peluang itu. Dan saya menghubungi peluang itu yang dipanggil ENGR. Saya memutuskan untuk mengenai perkara-perkara yang sangat lama, ENGR. Jadi bekerja khas, seperti bekerja, atau seorang doktor, boleh menghubungi peluangnya dari penerbangan dan melakukan sesuatu untuk anda. Sehingga, sehingga baik, tiada apa-apa yang baru, tiada apa-apa yang berbicara, ini semua benar-benar benar-benar. Doktor yang susah untuk mencari, penerbangan yang susah untuk mencari, khas untuk mengenai penerbangan yang sangat susah untuk mengenai. Kenapa? Saya menulis penerbangan yang dipanggil ENGR. Anda menulis penerbangan yang dipanggil ENGR. Kita semua menggabungi ke komuniti. Jadi ada 1,000 penerbangan di luar sana, mana yang anda memilih? Itu adalah masalah yang susah. Dan solusi sebenarnya adalah anda tidak memilih, komuniti memilih. Komuniti memilih dan memutuskan bagaimana penerbangan menyelamatkan. Ruby menggunakan sangat kuat 5 tahun lalu. Komuniti memutuskan bahawa penerbangan JS lebih baik. Jadi mereka memilih penerbangan JS. Komuniti memutuskan saya mengenai jawa. Komuniti memutuskan jawa adalah langgan yang baik. Jadi jawa akan tinggal. Sehingga mungkin ia dihubungi. Saya tidak tahu. Anda memutuskan, komuniti memutuskan. Saya tidak memutuskan. Anda sendiri tidak memutuskan. Tetapi anda memutuskan komuniti. Jadi anda memutuskan penerbangan jawa dan menggunakan yang komuniti memutuskan. Jadi memutuskan jawa. Jika komuniti tidak suka apa yang anda lakukan, ia akan memutuskan. Tiada siapa yang akan memutuskan. Dan anda akan meningkatkan desa natural. Dan anda akan memilih yang komuniti memutuskan. Tetapi dengan penerbangan jawa, tiada fokuskan. Penerbangan jawa adalah membutuhkan ke dalam langgan. Jadi langgan tidak memutuskan secara langgan. Jawa tidak memutuskan jawa. Ia merupakan jawa. Ia memutuskan penerbangan jawa. Penerbangan jawa. Ia memutuskan penerbangan jawa. Di mana yang memutuskan penerbangan jawa ialah kegantian khas. Ia tidak diputuskan penerbangan jawa. So complex software systems is a community of software workers, it has generalists who use only the standard library and specialists who use specialist libraries, specialist skills, which may or may not be obsolete, which may or may not go out of fashion, we don't know, only time to tell and all these workers have varying capabilities, some are more capable, some are less capable and all of them have creation and maintenance cost, every single worker, you have to pay them, not money but maintenance cost. So a good software architecture is an organization of software workers so that these all workers meet the system goal, it creates and meets the system goals and more importantly, the system can evolve to meet changing demands. The British Civil Service met its goals at that time, but it has a difficult time changing to meet new goals. So it's not a very good system in a dynamic environment, a very good system in a static environment. So human organizational structures hierarchical, collegial, cross functional, project based functional, startups, societies, race, religion, government, states, these are all labels we apply to human organizational structures. Software organizational structures, we just talk about monoliths, we talk about microservices, we talk about SOA, which is now bad word. We talk about software libraries and frameworks and repositories. What's the difference between a library and a framework? A library is something which your program calls. Obviously format, library, call format, print line component to print something on the screen. A library is something your program which you have written calls. A framework is you write a program for the framework to call. Ruby on Rails, you write a model, model.rb. The framework has a starting point. The framework starts up and it calls your program. So framework is a formalized structure, a standardized way of doing things that is pluggable. So you plug in your program and at certain points the framework will call your program to do a different function. The British Civil Service is such a framework. Foreign Service, Police Department, Immigration, blah, blah, blah. You provide code for the Foreign Service. People who know how to greet, people hello and goodbye. Foreign visitors, tech hearting, 007 spy, whatever. So these are software organizational structures. But what is success? In a human community, success is when a community feels good and you have a good leader who has foresight and planning and is able to make the hard decisions. In a software system, the software must fulfill its purpose. But it must be readable, maintainable and extensible. Anymore to add? What are the merits of a good software system? Those are the three things. It must be readable because you cannot read the thing, you cannot maintain the thing, you cannot extend the thing. So where do I draw my inspiration? Haka Roundhouse was drawn from a cultural reference. I'm a Haka, so I looked at my cultural reference and I created Haka Roundhouse. So how do you create successful software systems? I draw my inspiration from business. I was trained as an engineer, went to business school, got my MBA, ran a company, decided to send me retire from my consulting firm. And the most important thing they tell you in business school which you discover for yourself in business school is assign responsibility together with accountability. You are responsible for this area and you are accountable for it. Go and take care of it. Surround yourself with good people and let them do their work. So that's Business 101. And you need to be very clear with your goals. Goals must be specific, measurable, actionable, realistic, time-bound. These are SMART goals. Standard Business 101 thing. Can we apply that to software design? I think we can. Think about human responsibilities. You have the board of directors, CEO, top-level executive, CTO, you have engineering operations. Names are very important. You call them an engineer, all they'll do is engineer stuff. You call them operations, all they'll do is operate stuff. You call them dev ops. They will develop and operate stuff. Names are powerful. People say sticks and stones may break my bones but names can never hurt me. False. Names are very powerful. Be careful with names. So the first thing you want to do with declaring software responsibilities is to name the responsibility and the role very clearly. Here I've decided to come up with a simple web app. Front-end, customer management, order management, fulfillment. So these are all typical names you'll find in software. How do you implement those responsibilities? So in a startup, I've decided to start up a company with two other friends, the three jokers in the startup. We do everything. We do accounting, we do marketing, we do everything. We don't have the luxury of scale. A large enterprise could have one head of technology and a whole bunch of people working under him. Same responsibility, different implementation. It can be implemented with one person, monolith. It can be implemented using a army of software co-workers, micro-services. Importantly, it's a responsibility. So a set of deployables fulfill a role or responsibility. And this responsibility or role is a really fuzzy, abstract thing. So a set of deployables fulfill a role or responsibility. Fuzzy, abstract thing. But the things which implement them are concrete. The microservice binary. The set of microservices binaries. The monolith binary versus the microservice binaries. So we have to talk about good deployables. Artifacts. What's a good human worker? Independent worker, reliable, innovative, good communicator, so on, so forth. What's a good software worker? Independently deployable. I don't have to wait for anybody. That I think is my number one. Human, independent worker. Software, independently deployable. Number one priority. He does one thing and does one thing well. All this solid principle stuff. But number one, independently deployable. And he must perform high performance, low latency. So let's, enough of a abstract thing. Let's work an example. And concretize what is in my head. And I try to do a direct memory access and direct memory transfer to you guys. Through this medium. So I like adding two numbers because kindergarten taught me that. So I'm going to write a web app to add two numbers. It's a complex system. Why is it complex? Because it's got a front-end. It's got a router that routes, requests. To the back-end. So at minima it's got three parts already. So we are implementing what all of you know as MVC. Model view controller. Martin, Robert C Martin says MVC is not an architecture. I don't know whether I agree with him or not. But anyway, we are implementing MVC. In this example. So like I said, the first thing is name the responsibilities. So a front-end is quite clear. It's the web page. Facing the users. Is front-end a responsibility? I think so. It's the router responsibility that routes different API requests not API request. URL endpoints to the back-end. I think the router I decided to call it a front lobby. Main lobby. So you can channel from the main lobby to the different back rooms. That architecturally is a component. It's a responsibility. Of course adder the thing that actually adds things together is certainly a responsibility. That's clear. So adder is clearly a responsibility but front-end and router are they separate things? Are they separate responsibilities? What do you think? Can we introduce multiplier instead of adder without changing the front-end and router? Cannot. There coupling? Of course there is. So is MVC a good architecture because there's coupling it's not independently deployable? Let's consider that extreme case. Adder handle its own front-end and routing. So adder has its own front-end adder has its own routing. Multiplier is added. We have another front-end another routing. Good, bad. I think most of us would agree it is not so good. It's bad. But this is what independently deployable means. How do we resolve this conflict? How do we resolve? We feel, we know, we like MVC. But independently deployable? No. It doesn't meet the needs. And I think this tension comes about because we are confusing things. We are confusing software architecture with building architecture. It happens to share the same name. Completely different things. A building architect imagines different functions of different areas of the buildings and they are implemented as physical structures which are hard to change. You have to knock down walls. Very hard to change. A software architect must also think about responsibilities and areas. But you should stop there. And hand over his vision to the implementer, the software engineer, the developer. That is the job of the software engineers. So what does the software engineer do? He takes this hazy-wayzy abstract concept from the architect. Design a plan to build artifacts. And these artifacts, unlike building artifacts, are cheap. There are no concrete to pour. We make it expensive because we manually make those artifacts. If you automate this process building the artifact is cheap. It may take 10 seconds, it may take an hour but it's cheap if you automate the process. If you don't automate the process, it's expensive because somebody has to manually go step by step to create those artifacts. You better automate. And this process is called DevOps. That's all it is. That's why it's so popular to automatically create deployable artifacts. And it's unlike changing a building structure because it can be created so easily. So, the adder package. Let's make it concrete. I have an internal function called someString into integers and add them up and returns an integer and error status. That's all it does. Capital adder handler is something which you expose to the world. We are creating a specialist library here. Whether this specialist library survives or not, as I said, depends on a community. It's your job to put out this option but the community decides whether it's an accepted popular option. It's your job to go in. Either choose the best in the community or come with something better. Something which you think is better. So what this adder handler does is it just adds two numbers and for good measure I want to print out the time as well just for the fun of it. So it adds two numbers and prints out the time. Now let's look at the router logic. In Go, the router logic is quite clear. Handle all root paths under root handler. Handle anything under static path under a file server. So basically Go gives you nginx and a patchy server in the language itself. Because Go feels that web is popular. The community decides that web is a very powerful concept. It's giving you a web server and a file server which can act like an nginx or can act like a patchy server. That is HTTP file server. That's all it is. And any paths that say adder is routed to my adder package adder handler. Because I created an adder package adder handler I can take this thing out and substitute with somebody else's package if it's better. The problem is they must be compatible. And that's where GRPC comes in. Because GRPC tells you straight away whether they're compatible or not. Here I can't tell by looking at it whether they're compatible. But because they speak web language you will see in a while all handlers are compatible. Okay let's go through this most of you is standard HTML. Absolutely rock solid standard HTML except for this line. This whole string is encoded into a variable sorry a constant called main screen. And this funny back tick means it's a string, it's a raw string. Everything you come across is treated as part of the string and you come across another back tick. So the entire HTML page is encoded as a constant string. But there's something special here. Here adder form. Here I'm making use of Go templates to insert adder's presentation. So adder is responsible for this part. The presentation is responsible for everything else. So here you have shared responsibility. So if you go to any large organization you have a reception counter. You won't have a reception counter for engineering you won't have a reception counter for finance you have one reception counter. But if it's an Inland Revenue Service for example there may be some experts who are tax law experts or company law experts in the reception counter which the counter staff can refer you to. So this expert staff also said the reception counter. It's a shared counter but there are some specialist areas in that shared counter. Same thing, same concept here. Presentation is definitely a responsibility it is a reception counter but the specialist area is added. So that part is marked out for you. It's your area. You sit with the rest of the reception staff but that is your area. And this is what adder does. The adder form, that's what it does. It creates the form to accept inputs from 2 integers and display a result. The presentation desk doesn't know anything about adder. Adder's responsibility is to implement this. So he's got adder A, adder B and that's it. And now the main template. Here is where you inject adder form into into the main program. So here I, those of you not familiar ago this funny thing over here is an anonymous structure. I don't have to declare separately. I declare it inline. It's an anonymous structure with one field and that field is called adder form. That field is called adder form. And the type of that field is HTML HTML type from the template library. Then I can add in my adder form which I created just now which I showed you just now, this one. I can add in this form and that single binary. I can't run away from JavaScript. I love to not write a single line of JavaScript but cannot. If you want to do front-end stuff you want to do front-end interaction the browser only understands JavaScript or TypeScript or some variation of JavaScript. So you're forced to learn JavaScript and I'm forced to learn JavaScript but it belongs to adder. This JavaScript file is adder's responsibility. Nobody else's responsibility. It doesn't belong to the router. It doesn't belong to the front-end. It is adder's responsibility. So let's see this in action. Enough talk. I must go and do something. So it just says adder starting and I need to go to 8080. So the front-end takes care of the main header, takes care of the CSS styling and adder takes care of this part and that part alone. So in that sense there's separation of concerns but there's still one thing. It's that front-end with that specialist lawyer sitting in the corner. 2 plus 3 equals 5. Let's go back to the slides. I told myself you just reinvented Ruby on Rails and a bad version of it. You reinvented a bad version of Ruby on Rails. Yaks. But then I say what's wrong with Ruby on Rails? Ruby on Rails is very productive. Not all of us are Googles. All of us are Facebooks. For some of my customers, Ruby on Rails is a perfect fit. But this independently deployable thing really disturbs me. Now I'm combining my stuff putting my lawyer in the front desk with other people in the reception counter. MVC, it violates independently deployable. The software artifact generated by the build process is a single binary. You saw that already. So I won't run this. But let's look at the software teams. Conway Law says this. The structure of your software depends on your team structure. So the added team is responsible for added.go. Obviously. It's responsible for is that added.js? Okay, maybe. You're now going to somebody else's territory. You're going into no high interaction territory. But let's say it's your responsibility. Your responsibility for the main function added.go. And main.go. Of course. Main.go again. Main.go is repeated several times in the front end, in the lobby. Is there separation of concerns here? Not on a file level. Certainly not on a file level. But there is. I think so. Only if you maintain discipline. Why do I say that? Here. Okay, where am I? Where am I? Here. If I choose not to go into the specialist area, I won't disturb him. It's in the same file. It can be in the same repo. But I choose not to make edits to that area. They are virtually separate. Physically together. You get the concept? They are virtually different but physically implemented in the same file. This is not for mere mortals because we don't have the discipline to enforce this. And our developers will mess this up in no time. So that's why Martin Robert C Martin say's MVC is not architecture. It's a mess. But we need to enforce discipline. We need to enforce discipline. And if we can put bold command lines. Do not touch this area. Then it's okay. We maintain virtual separation in a physical file. Go is like that. Go has pointers. Such a backward language. Pointers. Why? Because it's practical. So don't be idealistic. I've learned in my career that software architecture is not something idealistic. It's something practical. MVC is practical. It works separate virtually. So only if discipline is maintained. And boundaries, virtual boundaries I maintain are respected. And if you want to shrink the reception desk from a big desk to a small desk it's going to be a problem. Our lawyer friend is going to get kicked out. We don't have a desk to sit on. So similarly if somebody changes the system CSS. The app.css on the main.css. And chooses a very tiny font. Your form is going to break. That is interaction. So in the business world as well as in the software world there's going to be turf wars There's going to be office politics. There's going to be boundaries. And there needs to be coordination. Same thing in the software world. So that's why I say discipline is the key for practical systems. That's why I came out of Hakkar Roundhouse. You saw that already. And I infer and disipline using PRPC. It's one implementation of this thinking. But what if the responsibility changes? We upgrade old responsibility to new responsibility and change the world and replace all the deployables. Or do we do a swap out? Retrench old responsibility and hire a new responsibility. What do we do? We are always faced with the question right? Let's make it concrete. A company Smith Corona make start writers. Should they upgrade to making computers? And retrain all its workers to make computers? Or retire the whole department? Create a new department? And hire new workers with the skills to make computers? Now obviously this is a very sensitive thing in the real world. Jobs and lives are at stake. Software much simpler less at stake. Morally what do we choose? Morally. Smith Corona decided to be like ostrich, stick the head, hit in the sand and continue making start writers and they died. Nobody uses start writers anymore. Morally we want to upgrade. Reality a whole bunch of people get retrenched. That's the reality. But the software domain is not so heartless. Software is a kick hinder than human organizations. So recall general software workers use the standard library. And the standard library is part of the language. Doesn't change, it's built in. Less general, less capable generators get archive, got retrenched lah. And new general workers are rewritten. And it's quite easy to write these new general workers because all they do is to call the standard library. And they can be 5 lines long. So throw away your old code and write 5 line long standard library code. That's what I'm recommending. But the problem is specialist workers. Stuff which you have invested millions of man hours creating. That now are big ball or mud. What do you do with them? You have this specialist worker that build 75 rockets. That now nobody knows how to build anymore. What do you do? You upgrade or you replace? My answer is you extract those skills and put them into a software library. And rewrite the modules extracting those software library functions. So you're going to decompose your big giant ball of mud into usable parts which can be reused into libraries. And hope the community accepts them. When I say community if you're working in NASA it's a 75 booster library components. If you're working in Traveloka it's something to do with booking travel systems. So software skills are held in libraries and those skills survive or die depending on the community's response. So why the response is grow? They are making computers now. Telephones Related skill What if it grows? And this is the problem we always face. This is the problem we always face. How do we grow a software module? This is not the architect's responsibility. Architect tells you the vision. The engineer writes the deployables. If your deployables were written the unique style using pipelines using go-routines using channels you can just plug in a new function. It's really pluggable. If you decide to write a normal function oh my goodness, there's too much freedom big ball of mud. If you enforce the boundaries using GRPC using go-routines using channels you can just plug in word count in this case. Just like in Unix it's so easy to write in bash because of that philosophy. Who's to blame? Not the architect. We software developers, engineers we choose to write bad monoliths because we're not disciplined. When you're writing code or by all means put it down on your screen write the code but before you even commit the code or commit and then immediately refactor refactor by imposing discipline refactor by imposing go-routines, channels, GRPC whatever your method impose the discipline then check it in again to the repository. So adding a new puppy into the pipeline is easy teaching an old dog new tricks understanding a muddy monolith is really hard and it's not the architect's fault it is us, the software developers fault Oh the last thing is quite interesting when we extend a big ball of mud please go and write test because that's the only way that's the safety net for you the only way you can put in stuff without breaking things and hopefully your test catch those mistakes which you are going to make to wrap up a key design activity is to name things to name the responsibilities and those responsibilities should remain abstract the people who implement those responsibilities are software developers, us and a key thing is to automate the building of those software artifacts develop sculpture, very important continuous integration, continuous delivery and the responsibility should be loosely coupled to our software artifacts don't get attached to the software worker the workers are dispensable the language, the culture the libraries are not build the libraries, build the culture build the frameworks kill the workers replace them so that is how I think I think we can build design and extend software systems comments very abstract understand maybe talking at a very high level and that's why I was hesitant in giving this talk in the first place but this was the inspiration for Haka Roundhouse Haka Roundhouse came out of this when you implement micro services one of the friends here in this room told me but my colleague just do anything they want now we don't know what messages are being passed around we have a big ball of mud now it's distributed ball of mud because the discipline wasn't there okay let's I'll keep quiet now if not thank you you've been a good audience