Привет, Хабр! Представляю вашему вниманию перевод статьи "Things I Don’t Know as of 2018" автора Дэна Абрамова.
Люди обычно думают, что я знаю многое, но это не так на самом деле. Это не так плохо и я совсем не жалуюсь. (Некоторая малая часть людей часто страдает от предвзятого убеждения, не смотря на то, что они заслуживают большего, что ужасно).
В этом сообщении я покажу незаконченный список тем программирования, который люди ошибочно предполагают, что я знаю. Я не говорю, что вам не нужно их изучать или я не знаю других полезных вещей. Но поскольку я не поставил себя в уязвимое положение, я могу быть честным по этому поводу.
Почему я думаю, что это важно
Во-первых, часто существует нереалистичное ожидание, что опытный инженер знает каждую технологию в своей области. Вы видели "карту обучения", которая состоит из сотни библиотек и инструментов? Это полезно, но пугает.
Более того, неважно насколько вы опытны, вы все равно можете обнаружить, что переключаетесь между чувством способности, неадекватности (“Синдром самозванца”) и самоуверенности (“эффект Даннинга–Крюгера”). Это зависит от вашего окружения, работы, личности, коллеги, психического состояния, времени суток и так далее.
Опытные разработчики иногда говорят о своей неуверенности, чтобы подбодрить новичков. Но есть огромная разница между опытным хирургом, который все еще нервничает, и студентом, который держит скальпель впервые!
Слышать, что “мы все начинающие разработчики”, может быть обескураживающим и звучать как пустой разговор с учащимися, столкнувшимися с фактическим пробелом в знаниях. Признания от доброжелательных практиков, таких как я, которые не могут превозмочь это.
Тем не менее, даже опытные инженеры имеют много пробелов в знаниях. Этот пост о моих, и я призываю тех, кто может позволить себе подобную слабость, поделиться своими. Но давайте не будем обесценивать наш опыт, в этот момент.
Мы в состоянии признать наши пробелы в знаниях, можем или не можем чувствовать себя самозванцами, и все же обладаем очень ценным опытом, чтобы сказать, что на разработку уходят годы напряженной работы.
С этим не несу ответственности, вот лишь несколько вещей, которые я не знаю:
- Команды Unix и Bash. Я умею ls и cd, но также подсматриваю все остальное. Я понял концепцию трубопровода(piping), но использовал ее только в простых случаях. Я не знаю, как использовать xargs для создания сложных цепочек или как составлять и перенаправлять различные потоки вывода. Я никогда как следует не изучал Bash, поэтому могу писать только очень простые (и часто глючные) сценарии оболочки.
- Языки низкого уровня. Я понимаю, что Assembly позволяет вам хранить вещи в памяти и перемещаться по коду, но это все. Я написал несколько строк на C и понимаю, что такое указатель, но не знаю, как использовать malloc или другие методы ручного управления памятью. Никогда не баловался с Rust.
- Сетевой стек. Я знаю, что у компьютеров есть IP-адреса, и DNS — это то, как мы работаем с именами хостов. Я знаю, что существуют протоколы низкого уровня, такие как TCP / IP для обмена пакетами, которые (возможно?) гарантируют целостность. Вот и все — в деталях не разбираюсь.
- Контейнеры. Я без понятия, как использовать Docker или Kubernetes. (Связаны ли они?) У меня есть смутное представление о том, что они позволяют мне разворачивать отдельную виртуальную машину. Звучит круто, но я не пробовал.
- Serverless. Также звучит круто. Никогда не пробовал. У меня нет четкого представления о том, как эта модель меняет бэкэнд-программирование (если оно вообще это делает).
- Microservices. Если я правильно понимаю, это просто означает, что «многие конечные точки API общаются друг с другом». Я не знаю, каковы практические преимущества или недостатки этого подхода, потому что я не работал с ним.
- Python. Мне всегда плохо вспоминать это — я работал с Python в течение нескольких лет, и я никогда не удосужился изучить его. Есть много вещей, таких как поведение при импорте, которые для меня темный лес.
- Node JS. Я понимаю, как запустить Node, использовал некоторые API, например fs, для сборки инструментов, и могу настроить Express. Но я никогда не общался через Node с базой данных и не знаю, как написать в ней бэкэнд. Я также не знаком с React фреймворками, такими как Next, дальше «hello world».
- Native платформы. Я пытался изучить Objective C в какой-то момент, но это не помогло мне. Свифт я тоже не учил. То же самое и с Java. (Я, вероятно, смог бы осилить их, так как работал с C#.)
- Алгоритмы. Максимум, что вы добьетесь от меня, это пузырьковой сортировки(bubble sort) и, возможно, быстрой сортировки(quicksort ) в лучшем случае. Я, вероятно, могу выполнять простые задачи обхода графа, если они связаны с конкретной практической проблемой. Я понимаю нотацию O(n), но мое понимание не намного глубже, чем «не помещайте циклы в циклы».
- Функциональные языки. Если вы не посчитаете JavaScript, то я не владею каким-либо традиционно функциональным языком. (Я свободен только на C # и JavaScript — и уже подзабыл C#.) Мне с трудом удается прочитать вдохновленный Лиспом (как Clojure), вдохновленный Хаскелем (как Elm), или ML-вдохновленный (как OCaml) код.
- Функциональная терминология. Map и reduce знаю сколько нужно. Не знаю моноидов, функторов и т. д… Я знаю, что такое монада, но, возможно, это всего лишь иллюзия.
- Современный CSS. Я не знаю Flexbox или Grid. Floats — это моё всё.
- Методологии CSS. Я использовал БЭМ (имеется в виду как часть CSS, а не оригинальный БЭМ), но это все, что я знаю. Я не пробовал OOCSS или другие методологии.
- SCSS / Sass. Никогда не принимался изучать их.
- CORS. Я боюсь этих ошибок! Я знаю, что мне нужно настроить заголовки, чтобы их исправить, но в прошлом я потратил на это уйму времени.
- HTTPS / SSL. Никогда не настраивал это. Не знаю, как это работает, кроме идеи закрытых и открытых ключей.
- GraphQL. Я могу прочитать запрос, но я на самом деле не знаю, как выразить вещи с помощью nodes и edges, когда использовать fragments и как там работает пагинация.
- Сокеты. В моем понимании они позволяют компьютерам общаться друг с другом вне модели запрос / ответ, но это все, что я знаю.
- Потоки. Кроме Rx Observables, я не работал с потоками так близко. Я использовал старые Node потоки один или два раза, но всегда получал ошибку в обработке.
- Electron. Никогда не пробовал его.
- TypeScript. Я понимаю концепцию типов и умею читать аннотации, но никогда не писал ее. Несколько раз я пытался, но столкнулся с затруднениями.
- Развертывание и devops. Я могу отправить несколько файлов по FTP или убить какие-то процессы, но это предел моих навыков в devops.
- Графика. Будь то canvas, SVG, WebGL или низкоуровневая графика, я не смышлен в этом. Я понял общую идею, но мне не нужно изучать простые вещи.
Конечно, это не полный список. Есть много вещей, которых я не знаю
Это может показаться странным для обсуждения. Об этом даже не стоит писать. Я хвастаюсь своим невежеством? Мой вывод к этому посту заключается в следующем:
- Даже ваши любимые разработчики могут не знать многих вещей, которые вы знаете.
- Независимо от вашего уровня знаний, ваша уверенность может сильно отличаться.
- Опытные разработчики очень компетентные, несмотря на пробелы в знаниях.
Я знаю о своих пробелах в знаниях (по крайней мере, части из них). Я могу заполнить их позже, если мне станет интересно или они понадобятся для проекта.
Это никак не принижает мои знания и опыт. Есть много вещей, которые я могу сделать хорошо. Например, изучать технологии, когда я в них нуждаюсь.
Комментарии (59)
Sazonov
30.03.2019 18:53+3Насколько становиться профессионалом и в какую сторону развиваться каждый решает для себя сам. Советую вам поискать «матрицу компетентности программиста» — вы тогда поймёте, на каком уровне застряли. И тогда уже решите, надо ли вам двигаться дальше.
Лично я с детства страдаю любознательностью и не собираюсь останавливаться на том, что знаю на данный момент.androidovshchik
30.03.2019 20:27страдаю любознательностью
По-моему, это великий дар. Хуже, если тебе ничего не интересно, по опыту скажу. Ни в чем не видишь смысл
cynovg
31.03.2019 10:05+1Поискал, нашел кучу устаревших и/или спорных картинок. О какой именно матрице речь?
nanshakov
31.03.2019 14:46cynovg
31.03.2019 14:52Спасибо. А как относится дата оригинала к переводу? Перевод дополняется? Речь о
Версия документа от 17.05.2013
OnYourLips
31.03.2019 16:13Относительно своей области (корпоративная разработка) могу сказать, что она неактуальна и крайне субъективна.
Часть из этих знаний узкоспециализированная и нужна не всем, часть переоцененная, часть недооцененная (то, что в последнем уровне я бы на первый перенес, а во 2 и 3 добавил бы требований), а часть — сомнительные и даже вредные практики.
Я считаю, что подобная матрица может иметь смысл только внутри какой-нибудь области, причем с каждым годом эта область будет сужаться.
Ilha
30.03.2019 20:52+4Пост спорный и лично для меня интересный. И я хочу обратить внимание минусующих, что мы ставим оценку переводу — то есть тому человеку, который потрудился принести нам небезынтересный пост. Поэтому минусы смотрятся странно, честно! Автору — спасибо, май инглиш из бед, и я рад переводам.
ookami_kb
30.03.2019 22:46+2Вот лично я именно переводу и поставил минус. Потому что он очень некачественный. Ну и как уже написали ниже, есть официальная русская версия, ссылка на которую находится в самом начале оригинальной статьи. Т.е. смысл поста не совсем понятен (и по-моему на хабре вообще не приветствуются переводы в песочнице, во всяком случае, раньше так было).
mammuthus
31.03.2019 11:52Дело именно в низком качестве перевода, оно бросается в глаза с первых строк.
TheShock
31.03.2019 13:10Перевод — отвратительный, пример:
Я свободен только на C # и JavaScript — и уже подзабыл C#.
epishman
30.03.2019 21:05+3Этот чувак неимоверно крут, он знает много слов, которые типовой одинэсник даже не слышал.
Neikist
31.03.2019 10:59Вот не надо, довольно много 1сников о перечисленном представление имеют. Пусть на уровне автора оригинальной статьи или чуть меньшем. Говорю как недавний 1сник.
DMGarikk
31.03.2019 11:44недавний — вы им стали, или перестали быть?
Обычно те одинесники которые начинают понимать значение этих всех слов, очень быстро уходят из 1сNeikist
31.03.2019 12:074.5 года был с 1с. С нового года на kotlin под андроид пишу. Но я некоторое время вращался в 1с коммьюнити в телеграме и там встречаются люди которые о перечисленном имеют вполне неплохое представление.
Nalivai
31.03.2019 13:181C неплохо оплачивается
Neikist
31.03.2019 13:22+1Не сказал бы. Больше 200к мало кто имеет в 1с даже в москве. В моей провинции джун андроид или веб получает как среднетоповый 1с.
DMGarikk
31.03.2019 15:44У меня одинесный стаж около 10 лет, в т.ч. на 7.7
Могу точно сказать что обычному программеру надо существенно меньше знать и иметь меньшую квалификацию чтобы получать денег больше одинесника. я уж молчу об особенностях работы не на фикси (разъезды)
NeoCode
30.03.2019 21:58Хорошо что вы знаете что именно вы не знаете:)
Я вот честно не знаю, как придумать и сделать себе пассивный источник дохода в интернете, который приносил бы мне приличный стабильный доход и позволил бы заниматься тем что мне нравится и жить там где нравится. Вот это главное чего я не знаю. А все остальное…
Современный стек веб технологий это вообще бурлящая хрень, в которой технологии появляются быстрее чем их в принципе можно изучать. Поэтому не проще ли ориентироваться на результат а не на технологии? Нечто подобное было с десктопом когда-то, когда все кричали «COM», «ActiveX», еще какие-то слова, и где оно теперь? Смешалось до уровня неотличимости от прочих низкоуровневых API. Думаю, то же и с вебом будет.ATwn
31.03.2019 14:41Хорошо что вы знаете что именно вы не знаете:)
«Мы не знаем того, чего мы не знаем.» А. Курпатов.
CrashLogger
01.04.2019 20:52Думается мне, что пассивный доход в интернете — это несбыточные мечты. Слишком быстро все меняется, слишком большая конкуренция, невозможно сделать, запустить и забыть. Любой сервис придется поддерживать, развивать, продвигать и это требует постоянного внимания. Для пассивного дохода проще заработать денег на обычной работе, купить несколько квартир и сдавать.
m1ld
30.03.2019 22:10+3Алло, это что за кодер такой? Я знаю 90% из того что он не знает.
powerman
30.03.2019 23:38+1Просто он пишет на JS под браузер. А там нет сокетов, шелла, пайпов, доступа к настройкам TCP/IP, malloc, настройки SSL…
da-nie
31.03.2019 08:21Ну, допустим. :) А так знаете? Вот есть сокеты. Есть функция select.
Почему в Windows вызов select(0, &readfds, NULL, NULL, &tv); работает (и именно так и вызывается, с нулём в первом параметре), а в Unix нет? :)
serf
31.03.2019 10:39С чего вы взяли что он кодер? Мне вот видится что его основная роль это самохайп и евангелизм реакта поощряемые компанией в которой он работает тк очевидно копания представляется как желаемое место работы для кодеров с горящими глазами. Кто-то на самом деле должен этим заниматься в больших околотехнологических компаниях, почему не он. Вот пококетничал он в блоге написав провокационную статью, привлек большое внимание, очень многие ресурсы упоминули его в очередной раз.
4410
31.03.2019 19:02С чего вы взяли что он кодер?
Достаточно открыть его гитхаб. Это быстрее, чем писать комментарии, основанные на предположениях.
questor
31.03.2019 00:37Есть много вещей, которых я не знаю Я знаю о своих пробелах в знаниях (по крайней мере, части из них). Я могу заполнить их позже, если мне станет интересно или они понадобятся для проекта.
Это никак не принижает мои знания и опыт. Есть много вещей, которые я могу сделать хорошо. Например, изучать технологии, когда я в них нуждаюсь.
Вот на самом интересном месте… (( Тут есть пространство для отдельной статьи, о том, как нужно изучать технологии. (Особенно если ты не знаешь (список), но понимаешь где у тебя пробелы.
muhaa
31.03.2019 01:01-1Типичная ситуация. Меня зовут… и я
алкоголиксамозванец. Не знаю как писать многопоточные приложения. Каждый раз, когда нужно — пишу одну очередь задач, формируемую из разных потоков и обрабатываемую в одном потоке. Когда приходит время сделать из этого нормальное много-поточное приложение, собираюсь залезть в книги, но мне уже достается другой проект, а этой задачей занимается кто-то другой.
Не знаю правильный ли я код пишу и правильно ли использую объектное программирование. Потому что никогда никому нет до этого дела — руководство хочет, чтобы все работало и уже вчера и как только начинает работать, дают следующую кучу задач. Потом мой код достается людям, которые его сопровождают и не берутся меня судить или судят, но я об этом не узнаю.
Не знаю ничего про алгоритмы, даже про пузырьки. Когда нужен какой-нибудь алгоритм поиска и оптимизации того не знаю чего с 20 критериями просто импровизирую. Не уверен эффективно ли это в итоге, или можно было сделать лучше, если знать больше.
Не знаю тонкостей и нюансов ниодной технологии из всех с которыми работал. Каждый раз откладываю изучение и просто использую базовые возможности для которых очевидно как они работают.
Когда проектирую приложения, иногда до меня доходит фидбэк, что все плохо и пользователи ничего не могут понять, иногда что пользователи довольны. У меня есть ощущение, что я каждый раз горожу излишне сложные системы, но я не знаю наверняка так ли это и каждый раз нет времени и возможности разобраться.
Не знаю в итоге, программист ли я, или мне достаются проекты просто потому что я за них берусь и потом достаются следующие, потому что все знают что я занимался предыдущими с переменным успехом.
Расскажите кто еще чего-то не знает и ощущает себя «самозванцем».
kashey
31.03.2019 02:09+2— не знание всего того, чего не знает Дэн, не делает вас Дэном Абрамовым
— знание всего того, чего не знает Дэн, не делает вас Дэном Абрамовым
i86com
31.03.2019 09:48+1Если бы разработчики в самом деле знали технологии, с которыми работают, Skype бы не занимал 300 Mb оперативки, Gmail бы не тормозил, а Facebook бы не хранил вообще никакие пароли в plain text. И это я «по верхам» сейчас. Что «в низах» происходит, даже представлять не хочется.
serf
31.03.2019 10:30+2Склонен считать что все перечисленные примеры были осознанным и намеренным выбором компаний, а не незнанием технологий.
InterceptorTSK
31.03.2019 11:59+3Нет никаких компаний. Компании — это люди. В таком случае все же кто-то выбирал стек, и это вовсе не компания, а люди. И скорее всего — один-два человека. Так вот они похоже совсем ничерта не понимают в том что выбрали. Не им же писать на этом. И уж они совсем не разбирались в том, разбираются или нет в этом стеке подчиненные. В итоге вы видите то что видите. Ничего толком не работает. А даже если и работает — то крайне не оптимально.
Выводы…VolCh
31.03.2019 13:09-1А может просто оптимальность работы не была важным критерием при выборе?
InterceptorTSK
02.04.2019 07:26Дайте определение не оптимальной работе. Только без матов, пожалуйста.
VolCh
02.04.2019 11:20Вы написали «крайне не оптимально». И что бы вы не имели в виду, критерием могла быть не ваша метрика оптимальности. Пример: вы считаете что на PHP писать не оптимально бэкенд SPA, потому что сильно нагружает сервер это «родился чтобы умереть» или просто долго писать и много багов. А выбирающие стэк оптимизировали его по стоимости рабочей силы.
arturpanteleev
31.03.2019 10:45-1Очень странный пост. Что автор хотел сказать? Что можно не имея даже фундаментальных знаний на уровне первокурсника работать прогером и иметь хорошую репутацию в узких кругах?
Допустим это возможно, если под программировнием понимать верстку формочек на модном js фрейме, или настройку тем для Wordpress.
Да только вот все сильные программисты ИНЖЕНЕРЫ волей не волей знают большинство из того что тут перечисленно. И дело тут не в задротстве теории, просто чем больше опыт и чем больше твоя заинтересованность проектом, тем чаще тебе приходится вылазить из своей зоны ответственности и сталкиваться с проблемами, которые весьма косвенно относятся к твоей основной специальности.
В общем, если верх ваших амбиций — это тупо делать задачи из бэклога, списывая время потраченное на кофебрейки и настольный тенис, то ок. А если хотите серьезного развития(как профессионального, так и технического) то рано иили поздно вам придется унать чем отличаетя виртуализация от контейниризации и чем TCP/IP отличается от OSI.VolCh
31.03.2019 13:12+2Ну автор, грубо говоря, автор одного из модных js-фреймворков. Настолько модного, что некоторые считают его неотъемлемой частью другого.
muhaa
31.03.2019 13:25В том то и дело, что часто бывает как раз наоборот. Для того, чтобы реализовать свои амбиции не нужно иметь глубоких знаний. Достаточно хорошо осознавать главные принципы, иметь мозги и всегда первым рваться решать реальные задачи.
Vlad_IT
31.03.2019 20:57Соглашусь с тем, что программисты должны знать OSI модель (если работают в каком-то виде с сетями), но для чего frontend разработчику знать в чем отличие виртуализации от контейниризации?
Учиться приходится всегда, но объем знаний на столько большой, что всегда найдется человек, который скажет вам "как это вы это не знаете, это же банальные вещи".
Вещи описанные Деном я на каком-то уровне знаю, но только по причине того, что раньше занимался десктопным программированием а позже фуллстеком. Но во frontend разработке, например работа с потоками уже не нужна (работа с web-worker'ами это не то).VolCh
31.03.2019 21:01Не то, чтобы знать OSI должен, а представлять её в общих чертах.
Vlad_IT
31.03.2019 21:17+1Да. На самом деле, не представляю, как в голове может удержаться информация, которая часто не используется. Я в ВУЗе отлично знал OSI модель, все по пунктам как надо. Сейчас лишь помню, что такая есть, примерно понимаю ее слои. Но не смогу перечислить каждый слой. Поэтому да, в общих чертах.
arturpanteleev
31.03.2019 10:49+1Комментарий к переводу: не бойтесь выражать мысли своими словами, это гораздо лучше чем перевод слово в слово. Например:
Некоторая малая часть людей
Можно вполне заменить на «немногие люди». И таких примеров много по статье.
Т.е основная задача при переводе должна быть именно передать мысли автора, а не перевести каждое слово.
AlexanderG
31.03.2019 12:39+1Существует также авторский перевод, там слог посочнее: https://overreacted.io/ru/things-i-dont-know-as-of-2018/
al6dy
31.03.2019 12:50+4Невозможно знать все! Это факт. Если пытаться «быть в теме» во всех направлениях, то вы ничего никогда не добьетесь и будете висеть на уровне джуниора. Поэтому выбираете свое направление -> развиваетесь в нем по полной -> параллельно и чуть чуть без фанатизма затрагиваете общие аспекты = успех.
DmitrySpb79
31.03.2019 14:56Спасибо за перевод.
На самом деле, скорость изменения технологий в ИТ реально обескураживает. Пока я пишу этот комментарий, наверняка в мире появилась еще одна новая библиотека. Те платформы и технологии, которые я использовал лет 10 назад (Windows Mobile, MFC, WTL) сейчас не нужны никому от слова «совсем», еще лет через 10 наверняка случится то же самое с тем, что я использую сейчас.
Я не считаю себя самым плохим программистом :) но даже заходя на хабр, обнаруживаю кучу новых слов в заголовках статей, про которые вообще ничего не знаю, и совершенно нет времени узнавать.
Хотя в узкой специализации нет ничего плохого… пока не начинаешь искать новую работу, и не обнаруживаешь, что ближайшая вакансия по твоей специализации территориально в 200км :)
veterok4
01.04.2019 07:29Я не парюсь на счет того, что что-то не знаю. У каждого своя «клаузула».
Ну, не нужно мне уметь хорошо варить металл — зачем лезть в это?
Зато я умею хорошо считать сметы строительные.
Shishka
Это важно еще для цифровой социологии, из подобных профилей можно собрать большие данные и делать сумашедшие выводы из практики. Для развития в целом это может быть также важно как приаттаченые портфолио, статьи или код, описанные здесь компетенции про другое измерение.