Hey.

Last week I started the experiment.

I believe in semi-automated learning of programming through problem solving. There are clear advantages of this approach: independence of practice from the teacher, good testing of solutions, clear milestones for students, ability of the approach to scale.

The fundamentals of programming in this sense are quite good: it is easy to prepare problems, there is a clear learning plan, and student progress is well understood.

Surely some structured courses for learning the language from scratch already exist. But why not do it exactly the way I like it? IMHO, a set of problems is crucial here. The devil in the details: increase in the level of problems complexity, diversity, lack of requirements in mathematical preparation, and so on. I have teaching experience (OMG, almost 20 years!), some teaching materials from my work with students of Saratov University and the desire to try!

So, experiment. Since February 20, a wonderful girl le.mur has been learning the basics of C ++ from scratch under my supervision and guidance. We agreed that she captures her impressions in a special Instagram account (subscribe, it motivates!) Lena did not study mathematics in any special way, no initial skills in programming and informatics. Every day she practices 2-4 hours. I expect, one homework should be done in 1-4 days. My plan is to minimize individual explanations, as long as it turns out.

I brazenly stole a photo from Instagram

A training plan for the near future (that is, the very beginning) looks like this:

- The concept of a variable, the simplest functions (min, max, abs), problems without conditional operators and loops.
- Conditional operator, both forms (if, if-else). Understanding of scopes of variables, nested if-s. Problems on conditional operators.
- Loop statements: while and for. Problems for the use of loops without additional constructions (that is, they are solved in one loop without nested conditionals/loops).
- Problems to use loops and conditional operators together.
- Problems to use nested loops.

Each item corresponds to one homework and it will contain 10-20 problems on this topic. Further according to the plan, arrays and strings are expected, but they have yet to be reached.

One of the first conclusions that I managed to do for myself: at the initial stage, you should not immerse yourself in unnecessary details, a simplified or incomplete understanding helps to understand the basics. For example, while Lena operates only with integer variables (type int), she always puts curly brackets after control operators, uses only logical && and ||, only approximately understands the meaning of the “using namespace std” magical spell. It seems to me that after obtaining the initial skills, it will be easier to expand understanding with types, additional operators and other details.

I hope that Lena will succeed and she will not lose her motivation to study.

And how did you learn the very basics of programming? What worked well for you?

Thank you, I will definitely try to do well and learn a lot of new things!

Good luck!

Hello! I used a Brazilian site, called CodCad, (now its into another one, NepsAcademy). It teached me the very basics at CP and my first teacher was Rogério Júnior, a ex-competitor, silver at IOI 2016. He was the main reason, cause the way he used to teach programming was awesome and enjoing. Now he's at MIT, so im studying here, at codeforces!

Can you identify the main reasons and features that made Rogério's course so interesting and useful?

The simple way he approached to the questions, pacience to explain and, mainly, the love he showed while coding and teaching. He was so inspiring and he trusted at my potential and told me that I could have a chance to go to IOI. After that, I`m studying a lot in order to improve always!

I also can say that I learned most from CodCad. Really useful to grasp the concept

I did a self-paced online programming course, Harvard's CS50x, on and off when I was in 9th grade. But I feel like I've learned more from competitive programming and doing my own projects rather than taking a structured course, so this idea seems like a good combination of the two.

We all know Arrayman was born geniosity don't try to hide it

I think, I know who'll beat tourist one day :D

Yeah, that's basically how I learned programming. I had algorithmic theory from our local correspondence seminar, but as far as actual coding, I was just trying to solve problems and looked up concepts I had the most difficulty with (such as what the hell is standard input/output and how do I use it).

Heck, I had trouble understanding loops and arrays for couple of month in high school

Features of imperative programming languages: you write what computations you want it to do, it does that (or something else... or crashes...).

Features of an environment/framework: you write a magic command and a complex process gets done. How does that even work?

That's actually the same as my experience for learning my first language, C++. The teacher told us to solve problems using C++, and along the way I started to learn the basics of the language as well as those more advanced techniques (like sort by comparators, etc). I would say that such way of learning is pretty effective since the feedback (which is essentially the most important thing in motivating learning) is given immediately when you solved the problem.

Cool idea for a blog, but maybe more details would be helpful for other beginners. Are you choosing problems from online judges or preparing something new with small jumps of difficulty?

I remember a course of Pascal (and later C++) with simple problems: read A and B, and print the area of a rectangle with dimensions A and B. Reverse the array. Print the christmas tree made of characters '*'. So yeah, I also learned by solving problems.

It would be cool to eventually have a start-from-zero series of problems/lessons in Codeforces. On the other hand, such things exist already for sure (like a Polish platform from which I learnt).

I use educational problems (mostly just exercises) I used in Saratov State U with students/schoolchildren. Also I prepared some problems because in some topics I don't have much easy educational problems. If this experiment succeeds, I will consider the opportunity to publish the materials in the form of a course.

If you don't mind me asking, how exactly will you define the success of the experiment? Her being able to solve a certain difficulty after a period of time or maybe you have something else in mind?

Maybe rating around 1700?

Great idea! I look forward to hearing how far this goes (I bet very far).

Solving lots of problems on Project Euler :)

Getting instant feedback, having clear goals (for me, "solve the next 5 problems" is much more motivating than "try to learn Python, I guess"), gradually increasing difficulty

[hashtag]metoo

Good job!

I started solving problems after I had nearly completed 3 years in computer science, and I already knew most of the basic algorithms. Only after I started solving problems and competing online did I realize that I actually had not fully understood a lot of them, or the importance of complexity. I even lacked basic debugging skills, plus a lot of other stuff that I know consider to be basic knowledge. Not only did I gain coding quality and speed, I also started learning and using more advanced algorithms, and even having a good time while doing so, something I would have never done by myself by reading a book or attending some random lecture. TL;DR: I learned the basics in university, but what worked well for me was sitting down and solving problems and competing.

Whats her age. as its also a factor. MikeMirzayanov

i learned algorithms from geeks for geeks and online videos of tushar roy. the momentum i get is on codeforces. i practice alone. so when i get bored i watch petr mitrichev stream or his stories. i gets motivated.

finally solve problems and as Petr said in one of his early blog. Have a confidence that u will suceed.

Thank you, I will definitely try to do well and learn a lot of new things!

Your idea reminded me of my experience in adaptive simulator (Python example). The essence of the practical approach: a person is looking for information when it is needed. If the problem is not solved, the authors give a simpler one.

+The analysis paralysis is unlikely (I know that gkseni loves this concept). This problem occurs among theorists and is sometimes called"overthinking".+The information that a person searches for himself and immediately applies is best remembered.-Knowledge will not be complete (online course can help).-You need to have the strength to decide to open complex tasks, when you can enjoy only simple ones.And thanks for this post. My not very long way in IT began with a thought: to solve problems on the first date is so romantic. :D

Update on March, 17: In 3 weeks le.mur solved about 60 problems, studying each day for 2-5 hours except weekends and few day-offs. Now she is studying linear arrays (she uses std::vectors).

apart from givig her algorithms teachings . are u giving her maths training too which is required to solve tough problems.

Update on April, 15: In ~7.5 weeks le.mur solved 105 problems. She continues to study each day for 2-5 hours (there was a rest week because of ICPC finals plus weekends). She is starting

`std::string`

s. I think after strings and practice with multi-dimensional arrays, she will be ready to take part in Div3 rounds!