Boolean parameters considered harmful

A lot has been said on the harm of Boolean parameters. And it seems that this harm is absolute truth without any “it depends”. Recently I had a little accident at my work, which was very much related to Boolean parameter and my own laziness. In C#, I had a class, which I wanted to instantiate. I also wanted that class to be able to act in a little bit different manner, depending on the setting, passed to its constructor. It happened to be 2 different settings possible and I thought, that here was exceptional case and I would better go with Boolean parameter. I made this decision, acted, checked-in. No, I did not unit-test. It was just simple constructor, and simple API to invoke that constructor. It was all great until this Boolean hunted me down few months later.  This is what happened. I was instantiating MyClass using Activator.CreateInstance, whose signature was the following:

public static object CreateInstance(Type type, params object[] args)

This is it. Very simple, I just ask to create me an instance of MyClass using its constructor with Boolean parameter. What do you think is the output of the following code?

public static class Program {
    public static void Main() {
        Console.WriteLine(MyClassCreator.CreateWithTrue().MyProperty);
    }
}

public static class MyClassCreator {
    public static MyClass CreateWithTrue() {
        return (MyClass)Activator.CreateInstance(
            typeof(MyClass), 
            true);
    }
    public static MyClass CreateWithFalse() {
        return (MyClass)Activator.CreateInstance(
            typeof(MyClass), 
            false);
    }
}

public class MyClass {
    public bool MyProperty { get; set; }
    public MyClass() { }
    public MyClass(bool myProperty) {
        MyProperty = myProperty;
    }
}

Although I wanted my instance to have MyProperty initialized to “true”, it was actually initialized to “false”. And it was so because of another a bit lazy guy in Microsoft, or whatever company which wrote Activator, who decided to overload CreateInstance in the following way:

public static object CreateInstance(Type type, bool nonPublic)

Now, when compiler performs linking the call to CreateInstance, it choses the overload with closest match and it is the one with Boolean parameter. Hence the wrong method got called and in reality default constructor was used to instantiate MyClass.

Now, of course, you can object and say that one has to look carefully to what he/she invokes. While this is true, it is often really easy to miss something, and therefore it is much better to protect yourself as much as you can. If only I used enumeration with two possible values, this clash would not have happened:

public enum Options { OptionTrue, OptionFalse }

public static class MyClassCreator {
    public static MyClass CreateWithTrue() {
        return (MyClass)Activator.CreateInstance(
            typeof(MyClass),
            Options.OptionTrue);
    }
    public static MyClass CreateWithFalse() {
        return (MyClass)Activator.CreateInstance(
            typeof(MyClass),
            Options.OptionTrue);
    }
}

By the way, this error was not detected on the test, and in fact introduced security issue. And only diligent developer, who wanted to reuse MyClassCreator, stumbled across this strange code with Boolean literals and raised an alarm.

Conclusion: if you want to use a Boolean parameter to whatever method, think twice and be prepared to be hunted down later. Code with Boolean parameters not only makes you think hard to understand what does “true” or “false” might mean in the given context. It also can make you commit very nasty errors.

Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail

Міграція з науки/освіти в ІТ

Оновлення: бесіда на цю тему з Іриною Ясеновою-Берестюк.

Отже ти науковець чи просто викладач університету, що пов’язаний з комп’ютерами та програмуванням. Можливо у тебе буває відчуття, що життя ніби проходить повз тебе. Ти даєш знання і путівку в життя молодим людям – студентам, але твоя власна кар’єра, здається, знаходиться у глибокій стагнації. Ти в кінці робочого дня розумієш, що нічого не зробив, а бігав по кабінетам, підписував папірці, писав нікому непотрібні звіти. Підписував і перепідписував їх кланяючись кожному бюрократу, що заплив салом і створює видимість роботи. Ти пишеш статті, витрачаєш на них купу зусиль, а тоді платиш за кожну опубліковану сторінку твоєї статті. Тоді вона виходить у якому не будь віснику, але ніхто її не читає. Ти шукаєш теми для досліджень, гарячково переглядаючи чужі статті, і не розумієш за що взятися. Що може принести бодай якусь користь тобі і іншим? Наукові дослідження для замовника з фінансуванням та реальними проблемами – недосяжна розкіш. Ти виступаєш на конференціях, де тебе слухає купка студентів і аспірантів, що їх примусово загнали до зали. Міжнародна наука – недосяжна мрія. Ти навчаєш студентів працюючи на півтори ставки. Вони після твоїх занять ідуть працювати на півдня, але заробляють більше від тебе і переважно вважають, що марнують час на твоїх заняттях. Хай йому абищо! Щось тут дуже сильно не так. Що там казати, навіть за кордоном освіта і наука майже повністю відірвана від реальної індустрії програмного забезпечення, а українська, вибачте, взагалі пародія. Є люди, які цього не помічають, або через це не переймаються. Це просто чудово! Хтось же має виписувати корочки і давати бодай якийсь фундамент студентам. Але якщо тобі це не байдуже, можна подумати про міграцію в ІТ. Як людина, що пройшла цей шлях, ось що я гадаю тобі слід знати про нього:

Міграція буде дуже болісною. З двох причин. По-перше, як уже згадував, наука і освіта відірвані від індустрії, тому формально ти без жодного досвіду. Для кадровика, якщо твоя наукова діяльність не збігається з предметкою компанії, ти ніхто. Навіть менше ніж ніхто. Тому що, як недивно, на приймаючій стороні компанії люди ніби “бояться” мігрантів з науки. Адже після власних універів вони добре засвоїли собі, що то люди непрактичні, часто занадто високої про себе думки і забагато знають для тієї роботи, що необхідно виконувати. Тобто по-друге тебе майже скрізь визнаватимуть overqualified. Практично це спричинить ситуацію, коли на майже на всі твої розсилання резюме відповіддю буде гробове мовчання телефону. Тут лише можу порадити почитати на моєму блозі способи/стратегії потрапляння в ІТ.

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

Хоча повернення в науку малоймовірне, педагогіка для тебе не буде втраченою. ІТ галузь – це безперервний потік знань і інформації. Навчати когось і вивчати щось самому потрібно увесь час. Тебе це приваблювало в науці, в ІТ цього навіть більше. Тобі потрібно буде писати код так, щоб його міг зрозуміти інший. Компанії завжди дуже тішаться, коли хтось влаштовує knowledge sharing сесії і готові таку людину всіляко підтримувати. Компанії також дуже раді, якщо ти береш участь у зовнішніх форумах, адже це для неї певний ПР. Я роблю усі ці речі. Крім того щороку проводжу кількатижневі курси з APL – мови програмування, що у нас використовують.

Ти втратиш свободу і спершу почуватимешся немов у в’язниці. Адже ти звик, що прив’язаний лише до розкладу своїх занять, а решту часу ти сам вирішуєш що і як тобі робити, де знаходитись. Ти звик придумувати навчальні програми, спілкуватися з людьми і загалом вести творче життя. В ІТ ти не вирішуватимеш нічого цього, як мінімум в траншеях, в яких ти почнеш свій шлях. У них тобі вкажуть ось тут сиди і пиши ось це і це, ось так і так. І так триватиме 8 годин щодня. Ти і комп’ютер. Майже ніякої свободи творчості. Виття вовком гарантоване. Але ти відкриєш для себе вечори, вихідні і відпустки. Можна спокійно відпочивати, а не думати про наступну статтю чи готуватися до чергової лекції. Ці дні і години належатимуть тобі і твоїй родині, а належно приправлені доларом вони набудуть абсолютно нових кольорів. З часом, якщо навчишся фокусуватися на поставлених завданнях і програмування загалом тобі подобається – звикнеш. Адже звикають в’язні до в’язниць))).

Робота в ІТ часом буває цікавою, і навіть дуже цікавою. Але це не наукові дослідження. Це переважно рутина, особливо в нашій країні, куди на аутсорс дають не самі цікаві проекти. Я багато разів себе ловив на тому, що я з досадою ляскаю долонею по столу і вигукую: “Блін, та це ж робота рівня хлопчиків що 2 роки в ПТУ провчилися, а я ж к.т.н!”. Але who cares? The work needs to be done. Тож будь готовий стиснути зуби і уявляти, що ця рутина – найпривабливіша у світі робота. Якщо цю мантру приправити усвідомленням того, що є реальні люди кому це потрібно і вони готові за це платити, то можна досягти успіху.

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

Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail

Як потрапити в ІТ?

Перед тим як потрапляти в ІТ, гарно подумайте чи воно вам справді потрібне. Це важка, інтелектуально виснажлива робота, часто нудна, часто стресова, яка знищує ваше здоров’я. У ній ти постійно ідіот, який нічого не знає, ти мусиш постійно вчитися аби хоч якось триматися на плаву. А програмісти за 40 взагалі зникають, є теорія що їх сплавляють по Дніпру :-)). Але якщо вам подобається писати код і вчитися, Господи, вам сюди, тут класно, затишно і грошовито:-). Я потрапляв в ІТ двічі, тому що робив перерву на викладання і наукову роботу. Зараз, напевно, буду потрапляти втретє, бо ІТ вийшло у мене з-під ніг, я трохи забагато провів часу на десктопі, який раптом став не актуальним. Ось способи потрапляння в ІТ, які я виділив із власного досвіду і досвіду моїх знайомих.

Некро-технології. Це, напевно, найпростіший спосіб потрапити до ІТ і доволі дієвий. Майже нічого не треба робити, але треба мати технічну освіту і якийсь мінімальний досвід, типу щось для диплому писав. Суть способу полягає  у пошуку компаній які застрягли у минулому і мають старезний код і технології, часто доморощені, від яких вперто не хочуть відмовлятися. Наприклад, трапляються такі, що сидять на Lisp, COBOL, APL, Gupta, Delphi, PowerBuilder. Я реально на кожну бачив вакансії.  Це можуть бути також компанії, які чомусь вирішили використовувати щось екзотичне, типу Erlang. Цей спосіб, я знаю точно, працює, тому, що я сам ним скоритався щоб потрапити до міжнародного вендора програмного забезпечення SimCorp, який активно використовує екзотичну мову програмування APL і купу жахливих доморощених технологій. Жоден успішний амбіційний девелопер не погодиться на цьому працювати, тому я просто з універу, погодившись працювати з “некро-технологіями” отримав чудову зарплату, закордонні відрядження, мед страховку і тому подібні няшки. Спосіб вкрай небезпечний – можна обрости мохом, почати пахнути нафталіном і на цьому і закінчити кар’єру. Необхідно постійно навчатися паралельно. Я зараз опанував C# і частину робочого часу отримую релевантний досвід виконуючи .NET проекти.

Блискучі знання з предметної галузі в якій активно використовують ПЗ. Наприклад, фінанси, комп’ютерна лінгвістика, обробка і аналіз величезних масивів даних, електроніка, телекомунікації. Якщо компанія спеціалізується на доволі складній предметній галузі і ім критично найняти програміста із гарними скілами в цій предметній галузі, вміння програмувати буде достатньо щоб отримати роботу. Наприклад я працюю у компанії що має фінансову експертизу. До деяких відділів можна потрапити саме тому що людина має дуже добрі фінансові знання. А фінансова галузь ще не сама складна. Я сам цей шлях не проходив, але я бачив надто багато людей що зовсім не вміють програмувати, але вони стають в моїй компанії навіть сіньйорами і чіфами, тому що для бізнесу їх уміння фінансові набагато цінніші ніж уміння писати код.

Знайомства. Звучить дещо пошло, я знаю, культурно це звучить типу references. Якщо у вас є знайомі, що працюють в ІТ компаніях, а особливо що впливають на прийняття рішень там – бінго! Цей спосіб може бути як дуже дієвий так і зовсім безглуздий. Можна сказати це навіть напівспосіб, тому що якщо у вас немає необхідних навичок вас ніхто не візьме на роботу. Але якщо навички все ж таки є, то серед купи народу з такими ж навичками, візьмуть саме вас. Тому знайомства дуже і дуже важливі. Як на початку кар’єри, так в її середині, а особливо вкінці. Я сам навіть пишу цей блог а потім виступатиму з цим перед аудиторію саме з такою метою: познайомитися і бути знайомим. Маю я і особистий досвід користування цим способом. Перший раз я потрапив до ІТ ще будучи студентом. Мій добрий приятель помітивши як мої очі блищать на заняттях з цифрової техніки і мікропроцесорів (Женя Бабін, привіт!:-)) запропонував зайнятися з ним веб програмування, яким він і багато інших студентів у ті часи (двотисячні ) активно промишляли. Також я маю досвід рекомендування людей. Двох рекомендував і обох не взяли. Не було потрібного скіла, не було потужного прагнення у людей, тому і не спрацювали мої поради їх найняти. До речі, походи на курси у компанії, має цінність саме з точки зору заведення знайомства з компанією, її потребами і працівниками. Ці знайомства можуть спрацювати.

Масове розсилання резюме. Цей спосіб класичний, про нього не потрібно розповідати, його знають і використовують усі. Ефективність цього способу однак, не підсиленого комбінуванням з іншими способами, близька до нуля. Ти шлеш і шлеш резюме, а потім чекаєш і чекаєш і чекаєш… І нічого не відбувається. Починаєш писати в резюме те, чого нема, тоді який не будь відчайдушний HR тебе запрошує на співбесіду, яку провалюєш з лунким тріском. Знайомо? Народ, хоча б резюме подбайте вилизати. Я проводив курси у своїй компанії для зовнішніх і мав насолоду дивитися на резюме що їх присилали щоб на курси потрапити. Господи, що я тільки там не бачив. Інколи живіт тріщав від реготу. Колись цей спосіб з розсиланням резюме був супер швидкий і ефективний. Програмістів було потрібно відчайдушно багато. Брали усе що могло if та for написати і пояснити різницю. Ці часи минули, нажаль. Сьогодні розіславши в купу місць резюме із меседжом “я класний, гарно вчився, і можу робити все на будь якій технології” отримаєте зловісно мовчазний телефон.

Стати відомим. Цікавий спосіб потрапити в ІТ чи не так? Але не такий уже й важкий як це було 10 років тому. Погляньте, скільки можливостей є у наших руках, які майже нічого не коштують: ведення свого блогу, відкриття свого YouTube каналу, написання статей на DOU, запис своїх подкастів, написання і інтернет-публікування своїх книжок. Бери – і роби, лише потрібен час. Звісно, ви для цього маєте бути не безробітнім чоловіком із жінкою та дітьми на голові. Але якщо ви студент або працюєте ще не в ІТ, цей спосіб можна застосувати. Я не можу, однак, сказати що цей спосіб дієвий, я сам його не використовував. Але зараз я дію саме за ним, цей спосіб є моєю кар’єрою стратегією сьогодні. Мені страшенно набридло ходити на співбесіди і відповідати на запитання типу скільки яєць можна кинути з якого поверху, як швидко множаться бактерії, скільки разів треба човном котів перевозити на інший берег, чи якусь іншу дурню. Я хочу щоб мені самі дзвонили і пропонували роботу ті, кому потрібні мої послуги. Для цього потрібно щоб про мене знали і знали як фахівця з чогось, тобто треба спеціалізуватися і колупати цю спеціалізацію роками. Але це уже інша тема.

Власний бізнес. Для таких людей як я ідея створення власного бізнесу негайно напрягає. У мене ж нема підприємницької жилки, я не хочу усіх цих клопотів із податковими, бухгалтерією, пошуком клієнтів. Але чим цікаве ІТ, що можна створити свій бізнес без усіх клопотів. Але по порядку. Суть способу полягає у створенні власного бізнесу, який розроблятиме програмний продукт. І зовсім не обов’язково когось наймати чи отримувати прибуток. Без найму і прибутку немає необхідності офіційно реєструватися, і займатися тяганиною з податковою та бухгалтерією. Обов’язково обрати популярну актуальну технологію і використовуючи її робити продукт, дуже класно якщо хтось ним ще й користувався б безкоштовно. Це могло б зорієнтувати які саме фічі потрібні. Це було б суперово, але не обов’язково. Але що ж це за бізнес такий, який не приносить доходу, або приносить мізер? Який зиск? А зиск у тому що через рік-два можна буде написати в резюме: ASP.NET, C#, Angular, JavaScript – досвід 2 роки, компанія така-то, продукт, що робив ось тут можна подивитися і код, що я пишу і його якість можна зацінити ось у цьому репозиторії GitHub. Та це ж уже звучить солідно, правда? А якщо є бодай один клієнт – то взагалі круть. Множимо це на знайомого, що принесе це резюме в руки керівництва і маємо першого реального клієнта/роботодавця з баблом. І тепер ми по справжньому в ІТ. Гадаю, ні в кого не викликає сумніву той факт, що це дуже дієвий спосіб, але й дуже важкий, вимагає багато праці і самовіддачі. Не підходить безробітній людині без засобів до існування. Мій приятель, Женя Бабін, що я з ним починав свою кар’єру, потрапляв в ІТ саме цим способом. Він типу створив компанію, знаходив в інтернеті клієнтів і спочатку пропонував їм виконати роботу за мізер, можливо були і безкоштовні випадки. Це не важливо. Важливо що на момент випуску з університету у нього було 5 років досвіду і купа виконаних проектів. Навіть досвід управління мною і іншими хто йому допомагав. Якби він захотів, він міг би отримати будь-яку роботу в Києві з веб програмування. Але він не захотів, бо його власний бізнес уже забезпечував усі його потреби.

Висновок. Потрапляти в ІТ краще тоді коли справді це подобається, тому, що ця галузь далеко не проста і виснажлива. Але якщо це подобається, то ІТ може бути дуже вдячним. Потрапити у галузь колись було дуже легко, а сьогодні дуже складно, але є, відповідно важкі, але дієві способи туди потрапити. Важка праця, світлий розум і гарні стосунки з іншими ІТ фахівцями врешті-решт приведуть вас до комфортного робочого місця, достойної зарплати і цікавої роботи. Щасти!

Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail