From Scrum to Lean

From Scrum to Lean

While Scrum’s primary goal is organization and project management, Lean is more about optimizing processes in order to quickly produce quality products. It can be your first step toward adopting Agile principles, or it may be something that your team evolves to, when Scrum isn’t enough. I invite you to read my team’s story, and how we evolved from Scrum to a more Lean-ish development process.


A Little History

Lean is a set of principles defined by the Japanese automobile manufacturing industry in the 1980s. The Toyota quality engineer, John Krafcik, coined the term, while observing the processes and tools used to eliminate waste in mass automobile production. It wasn’t until 2003 that Mary and Tom Poppendieck introduced Lean as a software development process in their book, Lean Software Development: An Agile Toolkit.

Whereas Scrum is a set of rules and roles, Lean is a set of principles and concepts with a handful of tools. Both are considered Agile techniques, and they share the same ideology of delivering fast, while reducing defects and errors. I always emphasize Agile’s adaptability, but can’t ignore the fact that Scrum presents itself as a mandatory set of rules. In fact, Scrum’s religious fans would shout blasphemy for not following Scrum’s rules to the letter.

Lean, on the other hand, is more open; its followers present the process as a set of highly adaptable recommendations.

It encourages the team or company to make decisions, and it adapts to the decisions and every-day surprises that your team and company face.

As my team matured and exploited Scrum, we felt that some aspects of it held us back. We became a fairly disciplined and homogenous team. Some meetings were not appropriate for us anymore, and we started to realize that daily meetings were not efficient. We learned that problems should be solved faster, and we felt the need to avoid these procedures that held us back.

We moved on.


The Two Major Concepts of Lean

Lean exposes two major concepts, but the core ideas are: eliminating waste and improving the work flow.

Eliminating Waste

If something’s going to break, it will break on Friday.

Anything that stands in the way of production is waste. This includes lost time, leftover materials, and an unused work force. Defects in the final product are waste; it wastes time to fix them, wastes money to replace them, and wastes resources to find other solutions.

The concept of waste nicely translates to the world of software development. Waste can be described by late deliveries, bugs, and programmers having nothing to do (do not confuse this with “programmers should program eight hours a day without pause and youtube”).

Improving Flow

Toyota’s Lean concept concentrates on the production flow. In a production plant, the flow is a chain of procedures that transform the raw materials into their final products. These procedures can be very different from one another and take different amounts time to complete, but they can each be improved to make them more efficient. It’s a constant battle finding and improving bottlenecks in the process.

An ideal flow is one in which each step takes the same amount of time and effort to produce the same amount of products.

This does not mean that each process should cost the same amount of money, but each process should be able to complete with the same amount of ease.

Ironically, Scrum was the tool that eventually led us to realize the waste in our project. While we adhered to pure Scrum in some areas of our production, we started to identify bugs and/or delays that we could easily avoid by taking a different approach.

We knew little about Lean at that point. We read a few articles on the subject, but we did the wrong thing and ignored them, because we were so focused on our Scrum process. We were nearly convinced that Scrum was the Holy Grail, but our “Scrum machine gun” started to misfire. We needed to open our minds.


The Principles of Lean

For software development, Lean’s principles were adapted into the following seven.

1 – Eliminate Waste

The change from Scrum to Lean was actually liberating.

In software development, you can find and eliminate waste by recognizing the things that need to be improved. In a pragmatic sense, anything that is not a direct value for the customer is waste. To provide a few examples: waste is a bug, a comment in the code, an unused (or rarely used feature), teams waiting on other teams, taking a personal call… you get the idea. Anything holding you, your team, or your product back is a waste, and you should take the appropriate actions to remove it.

I remember one of our problems was the frequent need to react faster than two sprints. Developing in sprints and respecting Scrum’s rules prohibits you from changing the stories assigned to the current sprint. A team needs to adapt when a user finds a bug and needs a fix, or when the most important customer wants a feature that can easily be complted in two days. Scrum is just not flexible enough in these cases.

2 – Amplify Learning

Place a high value on education.

You have waste, and you naturally want less waste in the future. But why is there waste? It more than likely comes from a team member that doesn’t quite know how to approach a particular problem. That’s all right; nobody knows everything. Place a high value on education.

Identify the areas that need the most improvement (knowledge-wise) and start training. The more you and your team know, the easier it is to reduce waste.

For example, learning Test Driven Development (TDD) can reduce the number of bugs in your code. If you have problems with integrating different teams’ modules, you may want to learn what Continuous Integration means and implement a suitable solution.

You can also learn from user feedback; this allows you to learn how users use your product. A frequently used feature may only be accessible by navigating through five menus. That’s a sign of waste! You may initially blame such waste on programmers and designers (and you may be correct), but users tend to use your software in ways that you never intended. Learning from your users helps eliminate this kind of waste. It also helps you eliminate wrong or incomplete requirements. User feedback can drive a product on paths you would never have otherwise considered.

At some point, my team identified that certain modules could have been better written had we known more about the domain in the beginning. Of course, there is no way to turn back time, and rewriting a huge chunk of code is not practical. We decided to invest time to learn about the domain when tasked with a more complex feature. This may require a few hours or even weeks, depending on the complexity of the problem.

3 – Decide as Late as Possible

Every decision has a cost. It may not be immediate and material, but the cost is there. Deferring decisions helps you fully prepare for the problems that you need to face. Probably the most common example of delayed decision is with database design.

Decisions don’t have to be technical in nature; communicating with customers helps you make decisions that impact the way you approach your products’ features.

But users don’t always know what they want. By deferring feature decisions until the users actually need the feature, you will have more information about the problem and can provide the necessary functionality.

Choose the Agile methodology that works best for you and your team.

Fourteen years ago, the team made a decision to store the application’s configuration in a MySQL database. They made this decision at the beginning of the project, and now the current team (my team) has a difficult burden to carry. Fortunately, that product is no longer in active development, but we still have to maintain it from time to time. What should be a simple task ends up being a monumentally huge.

On the bright side, we learned from our predecessors’ mistakes. We make programming, architectural and project decisions as late as possible. In fact, we learned this hard lesson before adopting Lean. Write open and decoupled code, and write a design that is persistence – and configuration-agnostic. It is certainly more difficult to do, but ultimately saves you a lot of time in the future.

Some time ago, we added a feature to our product that compresses data on the disk. We knew it would be useful, and wanted to add it to our product as quickly as possible. We started with simple functionality, avoiding decisions regarding options and configuration until a later time. Users began providing feedback after a few months, and we took that information to make our decisions on the feature’s options and configuration. We modified the feature in less than a day, and not a single user has complained or requested more functionality. It was an easy modification to make; we wrote the code knowing that we’d make a modification in the future.

4 – Deliver as Fast as Possible

We live in a constantly changing world. The programs we write today are for computers that will be obsolete in two years. Moore’s law is still valid, and it will continue to be so.

The speed of delivery is everything in this fast-paced world.

Delivering a product in three years puts you behind the pack, so it’s very important to give value to your customers as soon as possible. History proved that an incomplete product with an acceptable amount of bugs is better than nothing. Plus you have invaluable user feedback.

Our company had a dream: deliver after each sprint. Naturally, that is impractical in most cases. Our users did not want an updated product every week or month. So, while we strive to release each version of our code, we don’t. We learned that “fast” is what the user perceives – not what we are physically able to do. In our product’s industry, fast means regular updates every few months and critical bug fixes within days. This is how our users perceives “fast”; other types of products and industries have different definitions of “fast.”

5 – Empower the Team

Programmers used to be resources encased in cubicles, silently performing their tasks for their company. This was the prominent image of a programmer in the late 1990s, but that’s certainly no longer the case.

History demonstrated that that approach and traditional waterfall project management is not suitable for software.

It was so bad at one point that only around 5% percent of all software projects were actually delivered. Million-dollar businesses and products were failing 95% of the time, leading to huge losses.

Lean identified that unmotivated programmers caused that waste. But why the lack of motivation? Well, programmers and development teams were not listened to. The company set tasks and micromanaged the employees who were seen only as resources producing source code.

Lean encourages managers to listen to programmers, and it encourages programmers to teach their managers the process of software production. It also encourages programmers to directly work with clients and users. This does not mean the developers do everything, but it does give them the power to influnce the production’s evolution. Surprisingly, having that feeling of, “You know that great feature the users love? It was my idea!” is a big motivational factor.

But don’t think this only works for large teams; our team is small. Our company has only a handful of developers, so we have always been close to our users. That relationship has allowed us to influence our product beyond what our managers might have initially envisioned.

6 – Build Integrity

Anything that stands in the way of production is waste.

Integrity is about the robustness of your product, and it’s how customers see your product as a whole. Integrity is about UI uniformity, reliability and security, and the user feeling safe using your product. Integrity is the complete image the user creates for your product. For example, UI integrity involves the look and feel between pages, screens, modules or even between the UI of your system and the company’s web site.

But integrity can also be observed and practiced at the source code level. Integrity can mean that your modules, classes and other pieces are written in a similar way. You use the same principles, patterns and techniques throughout your code base – even between different teams. Integrity means that you have to frequently refactor your code. It is continuous and endless work, and you should strive for, but never reach, it.

Maintaining integrity in our source code is a difficult task. We realized that finding duplicate code is the most difficult thing to do, and by duplication, I don’t mean a couple of lines of duplicate code in the same method or class.

It is not even about searching in different modules for the exact same code; it’s about finding those pieces of common logic, extracting them into their own classes, and using them in several places.

Finding logical duplication is very difficult and requires intimate knowledge of the source code.

I’ve been on the same project for more than a year, and I am still surprised when I find duplicate code. But that’s a good thing; we reached a point when we actually see these things and take action on them. Since we started actively removing duplicate high-level logic, our code quality increased. We’re one step closer to achieving integrity.

7 – See the Whole

Users don’t always know what they want.

When you create your application, you have to think about the third party components that you rely on in order to develop your product, as well as the other third parties your product communicates with. Your application needs to integrate with the design of a device or the operating system on a desktop PC. Isn’t it easier to use an app that integrates with your smartphone’s notification system, and the UI reflects the OS’ UI?

Yes, seeing the whole is not that easy. You have to detach yourself from the tiny details and look at your product from afar. One of the memorable moments in our product’s development was when we realized that we have to rely on what other programmers produce in other projects. We realized that the kernel of the system, programmed by others, is one of these third party components that we rely on.

At one point, that third party component changed. We could have just applied band-aids to our application, or we could’ve taken the easy route and blamed the programmers that wrote that component. Instead, we took the problem by the horns and fixed the problem in the third party kernel. Seeing the whole and working with it can be messy, but it can make the difference between a product and a great product.


Kanban – A Great Tool

There are several tools and techniques to make Lean work. I prefer Kanban, a board-based tool that is similar to Scrum’s planning board. Imagine a Kanban board as a double-funnel.

On the left are the never ending list of stories that we need to address. All the finished stories pile up on the right, and the manager or product owner determines when to publish a new release, based on this list.

In the middle is our effective Kanban process. The product should be in a stable and release-ready state when we complete a story. This doesn’t necessarily mean that a feature is done; the product may have a few partially implemented features. But the product’s stability, security and robustness should be production quality.

More Flexibility with Releases

We were doing quite well with our current sprint. It was a usual Monday, a calm day with little excitement, but we started to see some problems by Wednesday. That’s OK, it happens all the time. Overcoming these difficulties, however, required some extra time. Our product owner agreed with us to continue working on the current feature and extend the current sprint about three or four extra days.

Friday came with an surprise. You know the rule: if something’s going to break, it will break on Friday. An important and potential client required a certain feature before signing a contract with the company. We had to react (and fast!). A new release was mandatory… But wait! We are in a middle of a sprint. The product should be release-ready by the end of the sprint. What do we do? Scrum would say to do the new feature in the next sprint, but we’re already late with the current sprint! That was the moment, when we started to realize that we have to think smaller than an individual sprint. We need to be able to adapt faster, and we need to release sooner if necessary.


The Kanban Board

A Kanban board looks quite similar to a Scrum planning board, but with a few additions in order to better accommodate the Lean process.

The first column on the left is the full backlog: everything that we need to do at some point. On the far right, you have the other funnel, containing all the completed (but not released) stories.

In the middle is our process. These columns can differ depending on each team and process. It’s usually recommended to have at least one column for the next few tasks, and another column for the stories currently in development. The above image demonstrates several more columns to better present the development process.

The To-Do column lists the tasks that we need to complete. Then, we have Design, where developers work on designing the current stories. The fourth column is Development, the actual coding. Finally, the Testing column lists the tasks waiting for review by another teammate.

Limit Work in Progress

Nobody knows everything.

If you compare this Kanban board with a scrum planning board, you will immediately notice the obvious differences. First, each column has a number, representing the maximum number of stories that are allowed to reside in that column. We have four to-do’s, four in design, three in development and two in testing. The backlog and completed tasks have no such limit.

Each column’s value must be defined by the team. In the above image, I assigned arbitrary numbers to the columns; your numbers may differ significantly. Also, the numbers are not final. Adapt the numbers when you identify and remove bottlenecks.

Dynamically Allocate Resources

One of the most amazing qualities of Kanban and Lean is the importance of collaboration and effort reallocation. As you can see on the board, each column of our process contains cards with people on them. There are eight developers on the example board – quite a large team! The board always presents the current status of who is doing what at any given time.

According to our board, there are three individuals working on design, two pairs working on development and one developer testing. Stories move to the next column their the work in the current column is complete, and depending on the type of development and organization of the team, the same developer can continue working on the same story as it moves through the process.

Let’s presume that we have specialized people. So the three designers’ primary function is design, the four developers write code, and the lonely tester primarily tests the product/feature. If a designer finishes a story, the story moves to development and another story from the to-do list is pulled into design.

This is a normal process. A story was moved from design to development, and now development is at its maximum stories. But what if another designer finishes another story? That gives the developer team four stories – an unwanted situation.

Lean wants to avoid congestion. It is forbidden to move a story to the next column if it exceeds the column’s maximum. In this case, resources need to be reallocated; the designer that finished their task must chose what to do next. His first option is to pull another task from the to-do column, but he cannot do that because he needs to pass his newly finished task to the development team (which he cannot do). His only other option is to start working on a development story. He may not be the best developer, but his efforts will help maintain the process flow.

If the tester finishes the last story in his column, he could help the designer on his development task.

This is great! The team can reorganize on the fly! Do you see a waste? Do you see a bottleneck in the flow? Take immediate action!

Once a story in the development column is completed, the tester returns to testing, the designer to designing, and the developers pick up the story the designer and tester were working on. But keep in mind that you do not have to follow that exact prescription; the developer could start designing as the designer and tester finished developing their story. It’s up to you!

Our board is now back to normal.

Welcome Scrum-Ban

It is forbidden to move a story to the next column if it exceeds the column’s maximum.

I watched with nostalgia as our scrum master dismantled our board. Piece by piece, he tore down our beloved board, which then became a mountain of crumpled paper.

Another colleague entered the room, a few huge sheets of fresh white paper in his hands. Our board was about to be reborn into something different, something better suited for our needs. After the paper sheets were on the wall, we started an ad-hoc meeting to define the columns we needed to define our process. We then debated the amount of stories that should be in each column. After everything was carefully painted and arranged on the wall, we experienced that strange feeling… sadness for the old but happiness for the new.

We did something that many people call, Scrum-Ban. We kept some scrum concepts, such as the scrum master and product owner roles, and we still estimate and evaluate the stories. But we now focus on Lean and Kanban, preserving flow, and discovering and fixing waste and bottlenecks.

The change from Scrum to Lean was actually liberating. Team members became much more friendly with one another, and we understood that we should offer help as soon as there is nothing in our column. This feeling that developers matter made us think about the project as a whole; we care more for the project than we ever have before.


Final Thoughts

Lean was not always considered Agile. Even today, some Agilists refuse to recognize it as an Agile methodology. But more and more, programmers accept Lean as one of the ultimate Agile methodologies.

As one of my wise colleagues pointed out, Lean and Kanban allow you to follow this methodology on your own. So, if you are a lone developer and need some tools to make your life easier, try out some free Kanban tools.

The AgileZen website offers a free account, letting you track a single project.

I found it to be one of the best free online Kanban tools; I even use it every day for tracking and planning the progress of the articles and courses that I provide for Tuts+. Of course, you can always upgrade your AgileZen account, if you need to track more projects.

In this article, we reviewed Lean and Kanban as an evolution of Scrum. Does this mean that Lean is better than Scrum? Absolutely not! It depends on the projects and people you work with. As always, choose the Agile methodology that works best for you and your team.

Note: Want to add some source code? Type <pre><code> before it and </code></pre> after it. Find out more
  • Xxx

    Finnaly! A Lean! Great article!

  • http://www.martin-brennan.com/ Martin Brennan

    Fantastic article! I’ve been waiting to see a methodology that was Agile but not as restrictive as SCRUM, thanks Patkos.

  • http://twitter.com/jchyip Jason Yip

    Krafcik wasn’t Toyota, he was a grad student at MIT

  • http://twitter.com/jchyip Jason Yip

    Some more details about early Lean Software Development history here: http://msdn.microsoft.com/en-us/library/vstudio/hh533841.aspx Bob Charette was apparently talking about it in 1993 but I’d agree that the Poppendiecks are the primary source of the latest trend.

  • http://twitter.com/jchyip Jason Yip

    One last comment… Lean = Eliminate Waste + Improve Flow tends to be seen as an oversimplification: http://timebackmanagement.com/blog/obsess-on-the-customer/

    • Patkos Csaba
      Author

      Yes, it is. But since this is just an article a simplified explabation was better suited. Simple explanation = easier to grasp the concept. Than, anybody can go on and read a book if curios.

      • DED

        I appreciate your concern for the idea that simplification makes a difficult topic easier to learn. However, I want to point something out is often lost on instructors. Simplify in this case should be breaking an idea into easy to grasp parts, not dumb down. In your article you run the risk of misinforming because you left out an essential part of Lean ( i.e. ‘respect for people’). Thus you are also run the risk of having your audience not understand the principles of the Lean philosophy, they then have to go read a book to actually understand the principles. So in the end , you created more, not less, work for your learners. Even in ‘just an article’ it’s better to explain fully but simply rather than dumb down.

      • Patkos Csaba
        Author

        I’ll consider your observations.

  • http://rijalulfikri.web.id Rijalul Fikri

    Love this part : do not confuse this with “programmers should program eight hours a day without pause and youtube”, hahaha.
    But I’ll change the last word to playing DoTA instead of youtube

    • Patkos Csaba
      Author

      That probably depends on the team / company. DoTA it is for you than :D

      • http://www.facebook.com/jesus.bejarano.948 Jesus Bejarano

        I am totaly in the youtube category.

  • Victor Manta

    Very good article! After applying different methodologies, I learned that there are good and things that can be improved in each of them. Choose from every the best that fits you.

    From lean I very like the concept with Dynamically Allocated Resources.

  • pixelBender67

    Word!

  • Petar Zivkovic

    > To provide a few examples: waste is a bug, a comment in the code, an unused (or rarely used feature)…

    Ok, bugs and unused features are wasteful, but comments? Seriously? I’ve worked on projects were people did not comment their code, it sucks. Commenting takes all of a few seconds, and there is no way that those few seconds would have been used for something more productive anyways.

    Plus, when you come back 6 months from now (or 6 weeks), those few seconds of comments can save you several minutes or even hours when you need to figure out why something was built the way it was… especially if it was a temporary module or something that was meant to be integrated with other parts of the program later.

    Comments are not waste. That’s my rant, sorry but it had to be said.

    • Patkos Csaba
      Author

      I feel the need to disagree. If you write code in a way that it takes you hours to understand it after 6 months, or your teammates can’t figure out what your code does, I think that your problem is more code related and less comments related. Try to adopt good namings, apply patterns, isolate concerns, write tests, and your code will speak for itself. I am speaking from experience, a test is 100 times better than any comment.

      Comments become outdated very fast becouse people will stop updating them. Test can’t become outdated, or they will fail.

      I only agree with comments in exceptional cases, like when you are forced to write some obfuscated code because of a bug in a 3rd party library you can’t control. But again, these are extremely rare case, one comment per month or so.

      • Petar Zivkovic

        [quote] If you write code in a way that it takes you hours to understand it
        after 6 months, or your teammates can’t figure out what your code does, I
        think that your problem is more code related and less comments related.[/quote]

        Exactly! You are 100% correct, the problem is that not everyone will write their code this way. So, instead of empowering them, it’s better to endorse the use of comments. Let’s face it, those who write elegant, readable code will know it; and will be able to make a better judgement on whether a comment is necessary or not.

        I still prefer people comment because most code I’ve had to ‘fix up’ has been poorly written in general, and lack of comments make that job much more difficult.

        Comments are useful. But that’s just my opinion… I know it’s not everyone’s. Great article by the way, very detailed, and I like the real-world examples you’ve included.

      • Patkos Csaba
        Author

        Thanks for the appreciation. And of course everyone is entitled to he’s opinion :D

      • Kirsten

        Try BDD and forget about comments

      • brunocrt

        Comments are a proven best practice. Who was a programmer knows that. It means save time and help to avoid mistakes. BDD is a good method but it has its limits and is where you complement with comments. Software has a life cycle after its first production release. Good software developers write maintainable software.

      • Kirsten

        Your reply above is a great example of why comments do not work. Let me explain:

        “Comments are a proven best practice.” – according to who? Where can I find the evidence for this? I can’t see it in the Joel test

        “Who was a programmer knows that.” – I was a programmer for 10 years before becoming a business owner. Comments are introspectives, there are no rules behind their presence or content. Show me code across projects with different developers which use a consistent methodology for comment writing and I’ll show you a pig that flies. Above all, left to their own devices, developers do not use a common language to communicate and so the only person able to understand a comment is the person who wrote the comment.

        “It means save time and help to avoid mistakes.” It does no such thing. It means coders can be lazy in their specifications and so have to leave comments to explain why they’ve hacked around with something or something doesn’t work as expected or some feature is left half complete because it was abandoned. Comments are left to interpretation and if the person isn’t a good writer or communicator or if they are not writing in their native language comments can make no sense at all when revisited at a later date.

        “BDD is a good method but it has its limits” Evidence please. It doesn’t sound like you’ve been involved in BDD from the above so I’d be interested in hearing what these limitations are.

        “Software has a life cycle after its first production release. ” Yes, that’s why BDD and Agile are so crucial: written in a common language that everyone can understand, user stories and BDD form a contract between all parties and define the scope and specification of an application.

        “Good software developers write maintainable software.” Good software developers write great specifications which form a contract between all parties so that everyone can understand what the code is intended for, what it does and what value it is bringing to the project. Comments are a hackie way of communicating something that isn’t spec’d out properly.

  • http://www.facebook.com/alzamabar Marco Tedone

    Great article. I found interesting that while advocating Lean and Agile techniques in general, in your process testing figures at the end of the process. Generally it appears at the beginning (at least when designing the API). = TDD. You might want to keep an eye on my book due towards end of Q1 / beginning of Q2, where I talk about this subject in dept. (http://leanpub.com/altf)

    • Patkos Csaba
      Author

      TDD is part of the development process and on the board it is not explicitly mentioned. The testing column refers to final manual testing and some hands-on tryout of the new feature before release.

      I intentionally left out TDD and details about it because even though I use it every day I’ve seen people working on teams in an Agile / Lean way but using less or no TDD.

      I think the best place to talk about TDD would be an XP article, maybe sometime in the future. XP is more technical and developer oriented. Lean and Scrum are more management oriented. Management doesn’t care how you develop, just do it.

  • John Tesh

    Lean is just a new fad that corp hipsters created to extend a job title.. it really makes no difference.. In fact I have seen lean implemented and have a horrible affect on the company and the employees. This is not a solution to any problem. In my opinion, it creates more problems and eliminates job’s.

  • Kirsten

    Great article, we’ve been through a similarly liberating experience int he last 12 months.

    • Patkos Csaba
      Author

      Thanks and good to hear that.

  • Kate

    I love the concept of Lean-Ban, and this is a great and thorough explanation. But do you really have developers doing design in a pinch? I’m the UX manager at my company, and based on the things my devs already slip into the UI without my input, I don’t want them anywhere near design. Or do you mean something other than graphic design in this context?

    • Patkos Csaba
      Author

      I meant design as in Javascript / CSS, not as in Photoshop.

  • Adrian
    • Patkos Csaba
      Author

      XP is part of Agile. XP is a great tool. XP is more technical and in a sense it is part of my team’s philosophy. Maybe there will be an article on this too in the future.

  • rcolorado

    I recommend using http://www.icescrum.org/, is perfect =)

  • Adrian

    http://www.adrian-stolarski.pl/articles/how-to-write-applications-in-agile-environments-part-1-comes-the-client.html
    We showed you the actual design, which is made with us. Every day, we’ll show you one step that we used when creating the project. In the next section, we will be prototyping application users. It will be done before we get to Moscow and writing specifications. This is the program for you. This is part of the SIMPLELIFE. If you think something else needs to be found here, send an email to: info@adrian-stolarski.pl

    If you think you want to have this program and go along with us through all aspects of the design of this program, please give a grant. It really is the program for you. That you have to support him. Also, that you have to take part in the design of the program. If you see any errors in the functionalities or want to add some functionality, write. We look forward to your feedback.