Вчителювання у кар’єрі програміста

Я дозволю собі розділити фахівців-програмістів на дві великі категорії: 1) фахівці, що відчувають дискомфорт і неприємні емоції від викладання чогось іншим; 2) фахівці, які залюбки діляться своїми знаннями або, принаймні, не відчувають дискомфорту, коли справа доходить до викладання. Мислення фахівців з першої групи, анти-вчителів, приблизно таке: “Чому я маю ділитися важко здобутими знаннями?” та “Замість того, щоб ділитися тим, що я знаю, краще я дізнаюся ще щось і напишу реального коду для клієнта”. Я не маю нічого проти такого мислення. Так налаштовані багато дуже кваліфікованих і ефективних фахівців, які творять чудеса проводячи руками по клавіатурі. І хоча я думаю, що відмовою від вчителювання вони шкодять своїй кар’єрі, яка за інших умов була б ще блискучіша, їм краще не викладати. Просто тому, що це їх дратує і змушує почуватися кепсько, а здоров’я важливіше за усе. Гарна новина у тому, що більшість програмістів усе ж таки належить до іншої категорії, категорії вчителів, або потенційних вчителів. Адже людина все ж любить говорити й ділитися тим, що їй по-справжньому цікаво. А програміст особливо. Спробуйте у самого запеклого інтроверта розпитати (краще за пивом, аби він розслабився) про його хобі-проект і самі в цьому переконаєтесь.

Однак мало хто наважується з’явитися перед аудиторією і навчати. Що ж зупиняє? Сором’язливість та брак мотивації. Про сором’язливість. Програмісти страшенно сором’язливі люди (ну нехай не всі, але більшість), а все тому, що професія вимагає постійного навчання. А ми знаємо, що чим більше вчишся, тим більше розумієш, що нічого не знаєш. Тому з’являється цілком зрозуміле небажання вчити тому, що розумієш, що сам знаєш не достатньо. Але згадайте скільки разів в університеті на лабораторних роботах ви задавали питання саме своїм колегам студентам, які так само, як і ви, навчалися і не були експертами. Психологічно легше запитати людину, яка разом з тобою проходить шлях навчання, а не експерта. Тому варто проковтнути скромність і якщо хочеться навчати – слід йти і робити це. Ніхто не знає всього. Потрібно лише трішечки знати більше ніж аудиторія, і цього достатньо. Так, можуть задати запитання, відповіді на яке ви можете не знати. Але хто знає все? Гадаєте експертам не задають таких запитань? Просто не претендуйте на експертизу, а визнайте, що вам треба вивчити глибше це питання, справді вивчіть його і дайте відповідь пізніше (наприклад, електронним листом або дописом у блозі).

Мотивація. Навіщо вчителювати програмісту? І так завдання виконує і платню отримує. Я б стисло сформулював причину так: для більш повного і цікавого професійного життя та розвитку кар’єри. А розлого розгляну такі причини/стимули:

Стати кращим програмістом. Програмування – це не просто інженерна діяльність. Це, якщо можна так висловитися, педагогічно-інженерна діяльність. Фундаментально ми формалізуємо процедурні (імперативні) знання так, щоб машини могли користуючись цими знаннями виконувати поставлені завдання. Тобто у певному сенсі ми навчаємо машину. Але важливіше викласти ці процедурні знання так, щоб інша людина максимально точно і швидко їх зрозуміла. У цьому є прямий економічний зиск: менше часу на читання коду -> більше часу на нову функціональність, що має цінність для клієнта. Тож щойно ви сіли вранці за клавіатуру, ви уже вчителюєте, і наскільки ви це добре робите залежить від того, як часто ви вчителюєте перед людською аудиторією. Хочу зауважити тут, що я маю на увазі не лише класичне вчителювання, типу викладач і група студентів. Вчителюванням може бути й скрінкаст, і подкаст, і допис у блозі, і вебінар, і коучінг джуна (junior developer :-)). Зараз існує дуже багато можливостей і форм вчителювання.

Гарно опанувати технологію/практику програмування. Кажуть, ніби щоб по-справжньому опанувати якусь тему, слід на цю тему написати книгу. А що таке книга для автора, як не спосіб поділитися знаннями? Програмісти мусять постійно навчатися, щоб залишатися потрібними на ринку праці й викладання мало не єдиний спосіб закріпити отримані знання. Можна заперечити, що багато практики закріпить знання. Так, це правда, вчителювання – то марнування часу, якщо крім нього ви не практикуєте як професійний програміст. Але якщо ви маєте гарну практику за плечима, вчителювання дозволить краще зрозуміти і запам’ятати тему, систематизувати знання, зрозуміти глибинні залежності та структуру понять і концепцій. Наприклад, ви можете мати багато досвіду в JavaScript та C#. Тепер спробуйте комусь пояснити чому JavaScript в першу чергу об’єктно-орієнтована, а не функціональна мова програмування. Спробуйте пояснити чим фундаментально відрізняються об’єкти від замикань у C#, що спільного між делегатами та інтерфейсами, що це взагалі таке, і ви відчуєте, як ваш рівень і глибина розуміння предмету росте. Інший приклад. Я працював уже два роки на APL коли почав викладати цю мову програмування іншим, і все ж мав важкі часи, коли готувався до лекцій. А після закінчення курсу по APL я став відчувати, що краще розумію мову, краще можу впоратися з конструюванням ідіоматичного коду на ній.

Зробити наступний крок у кар’єрі. У кар’єрі програміста дуже ймовірно може статися… глухий кут? Вивчення нових технологій заради нових технологій? Уже не цікаво, адже кожна нова – це по суті добре забута стара + кілька плюшок. Стати архітектором і сидіти у вежі зі слонової кістки, малювати діаграми та днями сидіти на мітингах? Не те, адже хочеться писати код. Менеджмент? Хай Бог милує! Чим же тоді зайнятися, куди розвиватися? Вчителювання може стати відповіддю. Тут людина може знайти вихід накопиченій за багато років енергії, мотивацію і сенс у поглибленні своїх знань. Адже людина – соціальна істота і може віднайти сенс своєї діяльності у вчителюванні та допомозі іншим опанувати цей непростий фах. Тепер, будемо відверті, вчителювання не надто високооплачувана діяльність. Але зовсім не обов’язково покидати роботу програмістом. Можна викладати й на робочому місці, після роботи, можна стати консультантом. Зрештою, можна погодитись і на постійне вчителювання, адже за роки роботи програмістом ви надбали достатньо і вам не потрібні уже високі доходи, чи не так?

Емоційно відпочити. Існує три типи навантаження: фізичне, емоційне та інтелектуальне. Людина відпочиває, коли отримує навантаження іншого типу, ніж те, що вона отримує під час роботи. Програміст отримує надмірне інтелектуальне навантаження і шкідливий фізичний стрес. Тож відпочинок має бути фізичним і емоційним. Якщо з фізичним зрозуміло, то як отримати емоційний відпочинок? Хто заперечуватиме, що робота програміста монотонна? Тобто щодня те саме місце і той самий комп’ютер, і мало що відбувається. А надто якщо програміст працює сам, віддалено. Змінити обстановку і відпочити емоційно можна вчителюванням. У цьому випадку вчителювання має бути не віртуальним. Потрібно обрати аудиторію, до якої треба поїхати. Це може бути конференція, тренінг, семінар або курси. Таким чином ви знайомитеся з новими людьми, буваєте в нових місцях і переживаєте такі потрібні нові емоції.

Поділитися знаннями та розширити мережу соціальних контактів. Не кожному хочеться ділитися знаннями, але багато хто отримує від цього величезне задоволення, бо як я вже казав: людина – соціальна істота. Багатьом з нас також важливо мати широку мережу соціальних контактів для спілкування, в тому числі й на професійні теми. Часто хочеться просто поділитися тим, що вивчив, чи тим, яку проблему розв’язав, або тим, яка цікава ідея спала на думку. Одним словом, тут немає раціональної причини, крім біологічної. Просто хочеться, просто тому, що соціалізація і взаємодія дала нам процвітання як біологічному виду. Тут є і цікавий побічний ефект. Ваші студенти з часом стають фахівцями, що приймають рішення. Це може дуже посприяти вашому наступному працевлаштуванню чи під час пошуку наступного клієнта.

Прорекламувати себе. Вчителювання – це чудовий інструмент маркетингу. Мало того, що ваша аудиторія дізнається про ваше існування, про ваші фахові та комунікативні здібності, так вона ще й дізнається у чому ваші інтереси, які технології ви опанували та на якому рівні. Зрештою, потенційні роботодавці та замовники розуміють, що ви не просто робите роботу за гроші й викидаєте з голови усе, щойно настає шоста вечора, а захоплюєтесь тим, чим займаєтесь, маєте так би мовити пристрасть (passion). Роботодавці дуже таке люблять, адже вони хочуть найняти людину з високою внутрішньою мотивацією, яка окрім основної роботи ще й буде сприяти поширенню знань і компетенцій в компанії. Зверніть увагу, що найпопулярніші у світі програмісти, які зробили своє ім’я не продуктом чи компанією (як Лінус Торвальдс чи Біл Гейтс, хоча, гадаю, і вони немало вчителюють), наприклад, хлопці, про яких я писав, досягли популярності в основному через вчителювання та активне просування своїх учительських та наставницьких послуг.

І нарешті, реалізувати професійну відповідальність за розвиток індустрії в цілому. Індустрія програмного забезпечення зростає шаленими темпами й щоп’ять років кількість програмістів збільшується удвічі. Це означає, що ветеранів програмування, яких між тим активно знищують менеджерські позиції, пенсії, хвороби й тому подібні речі, дуже мало. Таких, що програмують більше 11+ років, всього 24.2%. А про 20+ годі й казати. Тому відповідальність тих, хто входить у ці 24 відсотки, забезпечити становлення інших 76%. А це ж в середньому по 3 студенти/підмайстри на кожного!

Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail

Configuring function call

In programming, everywhere in the code we use procedural abstractions in the form of function/procedure or method (in object-oriented programming).  These procedural abstractions (later in the article I will call them just functions) usually have parameters. It is interesting that if you fix one or more parameters to some particular value, the function can acquire additional meaning and can be used as a dedicated function with a separate name.  For example, consider function add(x,y).  When you take the first parameter and fix it to some number, for example, x=1, then this function can acquire new meaning – incrementing. Function add(1, y) now can be named increment(y). The example is a bit unpractical, but this is done for the sake of simplicity. Although developers don’t pay much attention to such situations much, they often have to make design decision: what parameter to fix and what should be the name of the new function. After this decision is made, there are several techniques which can be used to implement this decision.

The first one is classical: using the object or just plain parameter passing. (in object-oriented programming sense). When the object is constructed, the value to be fixed is passed into the constructor. Here is C# implementation of incrementing functionality based on addition function:

In some sense, it is not the most elegant solution because Of method actually takes increment parameter implicitly. It could be done even in C by explicit passing increment parameter to Of function: Of(increment,5). It is not elegant because 1) caller should always know about increment parameter and apply it to Of function; 2) new semantics is conveyed through parameter name, that is “increment” which is the name of the parameter, not function. The function itself has a unexpressive name.

Much more interesting way to do the same thing is using closure. The closure is basically a function that has a special ability to access other variables local to the scope it was created in. Here is implementation of increment using closures in C# (yes, this great language actually support closures!):

If syntaxis of Evaluator method looks weird to you, it’s just C#6 feature – expression-bodied function. In this snippet, Evaluator takes argument x and then it looks like evaluation function gets called with an x parameter. But it is not what happens. In fact whole function y => evaluate(x, y) returns as a result and x is “closed” in this function, that is when Evaluator function returns, x variable is not destroyed as it normally would, it continues its life incide y => evaluate(x, y). That is why increment(5) gives 6. The parameter x still lives in object referenced by increment variable. Sounds cool? Not as cool as the next method!

Even more interesting, terse and elegant way to implement increment is using currying. Currying is the technique of translating the evaluation of a function that takes multiple arguments into evaluating a sequence of functions, each with a single argument. For example evaluation of function, add(x,y) can be considered as two steps process. 1) The parameter x is applied to add which yields another function, which takes one argument. The value of x is “embedded” inside returned function in the same way as it was done with closures. 2) Parameter y is applied to the just returned function which yields the sum of x and y. Unfortunately, C# does not support currying and hardly ever will. Therefore here is implementation of increment with currying in F#:

So, everything you do is “let increment = add 1”! It is hard to imagine something even more expressive than that.

It is not that currying is impossible to do in C# at all. You still can do some ugly hacks, the question, of course, is whether you want to do it. But who knows, maybe one day you will need it:

JavaScript is an interesting language. It does not support much stuff, but it is so flexible and dynamic, that one can introduce lacking concepts into the language using libraries. There is a very nice library, named Underscore.js, which facilitates very much functional programming in JavaScript. See how it is relatively easy to do currying in JavaScript using Underscore.js (actually I demonstrate partial function application here, but the subtle difference between partial function application and currying is off topic):

If it is hard to you to wrap your head around all these concepts, check out some course on functional programming. Sooner or later in your career you will encounter them again.
I can recommend a very nice introductory course from Delft university on edX.

Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail