Coding Gym is a non-competitive programming lab format open to any language and developed for self-led improvement in technical and communication skills.
We help others practice programming, software development and communication skills by making coding laboratories open to any programming language where:
- cooperation is valued over competition
- doing and sharing are valued over teaching, and
- competing solutions come with discussing and understanding tradeoffs.
Coding Gym is also the community of both organizers - called trainers - and of attendees - called gymmers. Actually, there is no dualism between those: trainers are gymmers when they practice and prepare the sessions, gymmers are trainers when they share solutions and ideas with the community.
Coding Gym is distributed, meaning that each session is prepared, organized and promoted by local communities. A central authority of Coding Gym gives continuous support to the local communities and it's in charge of launching new local gyms and maintaining the project consistent everywhere.
- How Coding Gym works
- Your expectations
- Practicing and contributing from home
How Coding Gym works
Coding Gym is organized every month. Each Coding Gym event is called session.
In each session, the gymmers work in pair on 3 self-contained coding challenges. After each challenge, a 15-min retrospective is moderated. The session should not last more than 2.5 hours.
A Coding Gym session is a friendly and non-competitive environment where we can freely express ourselves by facing coding problems together with other peers.
Since freedom without rules means nothing, we have two rules:
- we do collaborate in pairs to solve problems, and
- we obey the rules of each problem - each problem is a system of rules.
Thus, freedom should be seen as not being limited by any of the rules instead of violating the rules.
One key point supported by Coding Gym is that every challenge has value, regardless of the level of difficulty. Every challenge is just a system of rules where we can freely express ourselves with any language, style and paradigm we want. Potentially, every challenge is just the peak of an iceberg on top of many other topics, algorithms, concepts, data structures, problem variations, etc. We are heartly encouraged to creatively find more than one working solution.
We should look for alternative solutions and find pros and cons of each. This is part of the practice.
Some topics of our challenges:
- arrays and sequences
- search problems
- stacks and queues
- dictionaries, hash tables
- binary search
- reduce, zip and functional patterns
Facing programming challenges might be thought as a pure technical training but actually there is something more: collaboration with others.
Coding Gym is not a contest. Instead, Coding Gym creates a friendly environment for collaboration and active learning with pair programming.
One of the key point of Coding Gym is that nowadays technical skills are not enough. Those are important, however professionals should master effective communication and collaboration with other people as well. They should be able to explain and negotiate their ideas with others (even with non-programmers).
Coding Gym creates the opportunity to directly practice communication and collaboration.
After each challenge, the trainer moderates a 15-min retrospective. In that moment we are encouraged to explain our solutions.
It's another opportunity to test and practice soft-skills: instead of talking with only one peer, the communication shifts to the whole class. We can creatively and freely choose any format we feel like to explain our solutions and to speak with the rest of the room.
Moreover, since the trainers prepare the session with the support of the whole community, they might share with us other solutions and ideas, and ask questions to inspire us to achieve more from the problem. For example:
- which are pros and const of the solutions you have showed?
- what if constraints change (e.g. the input grows a lot)?
- what if the input gets particular properties (e.g. it is sorted)?
- can you find (and combine) patterns to solve this problem (e.g. fold/reduce)?
- what if the data types change (e.g. big integers)?
- what if some constants of the problem turn into variables?
At Coding Gym, a small change of problem requirements is called perturbation. Examples:
- making the input very big and very tiny
- removing for loops / use only standard library functions/constructs
- not allocating extra space
- imposing time and space complexity
- changing paradigm (e.g. functional)
- solving the problem in terms of another thing (e.g. design a queue by using two stacks)
- disabling some operations (e.g. integer division)
The trainer helps us consider the problem just as a starting point to explore more concepts and ideas.
Coding Gym is easier to do than to describe. However, it's worth elaborating on the philosophy underneath.
Reading between the lines, a Coding Gym session simulates several small software teams in charge of solving problems.
Each team consists of two people who collaborate to creatively and freely solve the problems. Each problem models a set of rules to observe.
During the retrospective, each pair can share ideas and learn from the other people.
The philosophy of Coding Gym has been developed around this very simple idea and it consists of 5 key points:
Open to any language, style and experimentation
Coding Gym creates a friendly environment where we can freely express our programming and soft skills.
We express oursevles by practicing with any language, style, paradigm and pattern.
Since we have an open mind, we are encouraged to break our mold and experiment with ideas, languages and styles we are not familiar with.
Collaboration over Competition
Coding Gym is not a contest.
With pair programming, we create a non-competitive environment conducive to active learning and collaboration.
Pair programming encourages us to interact with other peers and share information, thereby creating a more communal and supportive environment. The collaboration model inherent in pair programming exposes and reinforces us to the collaboration, teamwork, and communication skills required in the industry.
Conversely, competition comes with someone who has to decide and preset the concepts of winning and losing. For instance, “the quickest at solving the problem wins” or “the fastest solution wins”. Instead, at Coding Gym we know that every person has its own targets and interests. We just let them out.
Moreover, we have completely wiped out stress, anxiety and strict deadlines from our sessions and we have replaced them with fun. All of this fosters creativity.
We do not have prizes: the value is in giving our full effort. For us and our peers.
Every problem has value
In Coding Gym, problems are small system of rules in which we can freely express ourselves.
As designing planes without caring about the gravity does not make any sense, we consider freedom more as not being limited but rules than not caring about the rules.
Potentially, every challenge we face is just the peak of an iceberg on top of many other topics, algorithms, concepts, data structures, problem variations, etc. We are heartly encouraged to creatively explore and experiment with more than a working solution. When this is not possible during the session, we can do it at home.
Every solution has tradeoffs, thus we have the chance for investigating pros and cons. After all, a key in software development is choosing and balancing the best set of tradeoffs for a particular domain - a particular system of rules. Experimenting with and discussing alternative solutions, patterns, styles and tradeoffs is a core part of our practice.
Every problem can inspire us to get out of our own state of the art - our current knowledge - and explore new topics.
Only You can help yourself
Coding Gym is not a course.
There is no one-size-for-all set of concepts to learn just because we have different needs, targets and interests. We choose our own way. Our research is self-led.
Trainers are just people who totally support our research by giving us feedback, or pointing us toward our limits and strengths, directly. For instance, they might tell us that we are turning our back to the audience while explaining a solution. Moreover, the trainers might share alternative approaches, related topics, variations (“perturbations”) and might set insightful questions.
Made with community effort
Each session is prepared by the local community of trainers. Trainers solve and investigate challenges in advance.
The knowledge about each challenge is shared with the whole community of trainers and gymmers. Anytime, we can contribute to the community with our own ideas and solutions.
In a sense, the local trainers bring the current knowledge of the entire community into the session.
There is not a strict dualism between trainers and gymmers since trainers are gymmers when they solve and experiment with problems, in the same way gymmers are trainers when they explain solutions during the retrospective and when they contribute to the community on our website.
So, what can you expect from Coding Gym?
We have asked this question to many people who attended in the last few years and we have summed up the answers:
- improve your problem analysis and solving skills
- improve fluency with the standard library and the idioms of programming languages you know
- practice understanding and balancing software compromises
- know about new algorithms, data structures and coding patterns
- practice programming languages and paradigms you are not familiar with
- practice collaboration, negotiation and communication
- public speaking
- practice with programming interviews challenges
Anyway, our honest vision is that Coding Gym is an opportunity you can actively turn into something more. Our philosophy is clear on that: only You can help yourself.
Definitely, you can expect from Coding Gym:
- a friendly and non-competitive environment where you can freely express yourself by facing coding problems together with other peers
- room for practicing programming, collaboration and public speaking
- passion and competence of the trainers and the community
Practicing and contributing from home
Coding Gym encourages us to explore everything we find intriguing. Since we do not have explicit targets, we can use our problems to achieve more without restrictions.
Practicing alone and experimenting when we are not attending any Coding Gym session should be part of our self-led training.
It's very common to get new ideas on a problem when we resume it. An anecdote about that is when Marco Arena moderated one of the first sessions in Rome. A small and odd number of people attended and then he worked in pair with a gymmer on Beautiful Triplets . He had seen that challenge many times before.
After his peer found one solution, Marco gave him some hints to find another one. The guy was very smart and he found the one using a frequency table. After implementing it, he started thinking out loud about other ways to write the same solution. Suddenly, Marco got an insight: a pattern emerged from the solution. They started prototyping the idea on the whiteboard and finally jumped into the implementation in Python. The final solution has been written on our website under the section “Frequency table with patterns”.
So, every problem has value, even if you have seen the problem many times before!
At Coding Gym, we can refresh our memory on the problems and solutions on our community-driven challenge repository. Every challenge has an associated comment form we are heartly encouraged to use to contribute.