Exercism (https://exercism.io) is a platform that has been created to help people improving their coding skills, thanks to the volunteers mentoring the students. There are tracks for almost all the popular languages and each track has coding tests that the students can download, solve offline using their preferred editor, and test the solution against the provided unit tests. Once the solution is ready to be reviewed (or even if it's not complete but the student needs help), it can be submitted to the website and it will go in a queue where the first available mentor will pick it and start mentoring.

The service is free to use for all the students and the mentors are all volunteers (this doesn't mean that the platform doesn't have any costs. If you are curious about the resources needed to keep the platform alive, you can give a look at this answer on Reddit.

When I found out about the platform, I decided to use it (as student) to improve my Go coding skills. I must say that I've been learning a lot from the mentors and some of them are putting a lot of effort to give you all the possible advices to improve your coding style. In a single exercise once, I learnt at least five things about Go I didn't know before!

I've been a Python developer (professionally) for the last 5 years, but I've never considered myself an "expert". I decided to give it a try with mentoring, because I felt I wanted to give something back to the community, so I registered as mentor too and started mentoring in the Python track.

The first surprise has been that mentoring other students, I was probably learning more than how much I was teaching. First of all, once you already know how to solve a problem, it's always interesting to look at other possible solutions. I've found sometimes that students were providing better (more concise and readable) solutions than mine. Last but not least, before advising someone about conding style or a more idiomatic solution, I always double check things from different sources. There is nothing wrong making mistakes, especially if you are learning... but it would be damaging for the student if I was teaching them something wrong, so I need to be sure about what I say. This of course makes me study, even the basic things, again and again and at the end of the day, my skills are better too.

Once you join the mentors group, you are invited to a private Slack where you can count on the help of other mentors (we have channels for each track/language) or ask questions. So, if you are not sure about something, you can always ask around.

If my story and experience convinced you, Exercism is looking for more mentors! The more we have available, the less time the students have to wait in a queue to be mentored. You can find all the instructions at this address https://mentoring.exercism.io

Other articles

Python 3.7.x introduced a new method to insert a breakpoint in the code.
Before Python 3.7.x to insert a debugging point we had to write import pdb; pdb.set_trace() which honestly I could never remember (and I also created a snippet on VS Code to auto complete it).

Now you can just write breakpoint() that's it!

Now... the only problem is that by default that command will use pdb which is not exactly the best debugger you can have. I usually use ipdb but there wasn't an intuitive way of using it... and no, just installing it in your virtual environment, it won't be used by default.

How to use it then? It's very simple. The new debugging command will read an environment variable named PYTHONBREAKPOINT. If you set it properly, you will be able to use ipdb instead of pdb.

export PYTHONBREAKPOINT=ipdb.set_trace

At this point, any time you use breakpoint() in your code, ipdb will be used instead of pdb.

Using PGP can be quite hard, even if you have a lot of experience with computers.
By the way encryption is what gives us privacy and permits us to safely transmit information
and for this reason it should be easy to use, for everyone.

PGP identity

When Keybase was launched it was mainly a wrapper for PGP commands
to encrypt and decrypt a message for a certain user, but it also introduced a very nice
chain of trust.

In Keybase it's possible to either generate a new PGP key or import an existing one
but the most important thing is being able to verify our own identity using multiple proofs.

Many of us have a personal blog, a Twitter or Facebook accounts, a GitHub account etc...
All these accounts combined together make our online identity.

Every Keybase account can be verified by other online identities. In Keybase
you don't just say "I'm Andrea Grandi, this is my PGP key...". In Keybase you
can link your existing online accounts to your Keybase account and show additional
proofs of your identity.

Unless an attacker controls all your social accounts, they cannot impersonate and verify
themselves as if they were you.

Once you are on Keybase, other users can look for you even using your GitHub or Twitter username
without having to know your email address or Keybase username. This concept can be
very useful in some situations, we will see it later.

Encrypted Filesystem

One of the first features launched by Keybase was their encrypted filesystem.
There is a virtual folder located at /keybase (on OSX/Linux or k:\keybase on Windows)
where you will find at least three other folders: public, private, team.

Public folders

Anything you place inside the /public folder can be accessed by any Keybase user and it's
automatically signed. Every user public folder/file can be accessed using their Keybase username,
like for example /keybase/public/andreagrandi/hello.txt but you can also use any other identity like
/keybase/public/[email protected]/hello.txt or /keybase/public/[email protected]/hello.txt

Note: This is very useful if you only know a person on Twitter (or GitHub etc...) and you want to
share a file with them (or send a message, as we will see later) but you don't follow each other
and you can't reach them privately.

This is a public folder example of one of the Keybase developers:

You can put whatever you want in these folders: your public PGP key, your official avatar,
your Signal fingerprint etc... the other users will access these files with the assurance they
haven't been changed by anyone else in the middle.

Note: please keep in mind that Keybase doesn't work like Dropbox or similar. Files are not
synced between your devices and Keybase servers. Files are streamed on demand, so you won't be able to access these files without a working Internet connection.

Private folders

Hey but... where is the encryption here?! Whatever you put inside your private
folder can only be read by you and only you. Not even Keybase employees can access the content of your files,
because they are encrypted before leaving your devices and decrypted on demand
when you want to access them.

Do you want to share files with anotheruser? No problem. Just create a file inside /keybase/private/andreagrandi,anotheruser
(the folder andreagrandi,anotheruser will implicitely exist already) and that file will only be readable by you and anotheruser.

Security and other information

Keybase employes only have access to: 1) your top level folder names (like: "andreagrandi,anotheruser"),
2) when and for how long you are reading/writing, 3) how much space you are using.

They won't be able to access the content of your files and not even the files or folders names.

Every user initially had 10GB quota available, but a few hints (including one of their recent screenshots)
say that now users have 250GB available to store their files.

You can even send a message to a person who is not on Keybase yet: if you send a message to
[email protected], when randomuser joins Keybase and verify their Twitter account, the message
will be encrypted for them and will be safely delivered.

Security

Keybase doesn't use PGP to encrypt chat or files. Transmitting the key across all devices
wouldn't be safe so each message is encrypted using the public key of every device connected
to the account.

Command line

Keybase works from the command line too. There is no need to use the graphic
client to send a message to another user, you can do something like this:

keybase chat send andreagrandi "Hello mate!"

You can integrate messages in any script and it's even available a JSON API:

Teams

Keybase has recently introduced Teams feature. The Chat becomes more similar to Slack, but with the difference that
only team members can read the content of messages and files: the server only knows about team names and users, nobody else can
access the content.

It's important to mention that in Keybase there aren't private channels like there are in Slack: if a team wants to have
channels accessible only from a restricted group of users, the admin needs to create a sub team. For example if you have a
team called keybaselovers you can create a sub team for admins only called keybaselovers.admins

Teams have a dedicated encrypter folder that you will find under /keybase/team/keybaselovers

At the moment the features available from the UI are quite limited and are only available from the command line. In the next
weeks these features will be available from the UI too. In the mean time you can have a look at the commandline help:

Add a user to a Team

Git

Sometimes we have the need to store private information in a safe way and we want to be sure that nobody else is
able to access these information.

Latest feature that has been added to Keybase is encrypted Git repositories. They are like normal GitHub
repositories, but their content is stored in a safer way.

Privacy and Security

What is the difference with GitHub private repositories? In GitHub a private repository is used to store information that
only our account can access, but the files are accessible in plain text by GitHub employees. With encrypted Git repositories
instead, the information are encrypted before they leave our device and they are stored encrypted. Nobody, without having our
private key can read them, not even Keybase employees.

Teams and Quota

Encrypted Git repositories are of course available for teams too. Creating a team repository, it will be available to
all the members of the team.

Both teams and single users have 100GB of space available (which is separate from Folders quota).

Usage

If I create my personal repository called documents all I have to do to clone it and use it is:

git clone keybase://private/andreagrandi/documents

and I can use it as a normal git repository. Every time I commit and push something, the content will be signed and encrypted
and only available to the repository owner (which is me) or to the whole team if it's a team repository.

Conclusion

Keybase is still in continuous development but it already offers a few interesting features which can help people
in their every day life. I strongly advise anyone to get an account, play with the available features and report any bug
so the developers will be able to fix them and build an even better product. I can't wait to see the features they will
announce in the next months!