Анализ исходного кода open source

В последнее время начало довольно много появляться исследований кода причём с какими-то очень странными результатами и почти всегда просто потрясающего идиотизма выводами. Мне стало интересно откуда они черпают информацию и как анализируют код потому что у самого давно уже было много идей занятся подобными исследованиями.
И сразу же нашёл сайт GitHubArchive который создал один из известных разработчиков протокола HTTP2 Илья Григорик.
На этом сайте лежит вся публичная информация которую можно получить через API гитхаба с 2012го года. И по этой всей информации можно делать SQL запросы за вменяемое время.
Очень прикольный доклад где чуваки проанализировали и построили много интересных графиков: какой язык вызывает больше всего ненависти а какой больше фана, как взаимосвязаны между собой языки и какие нации в мире больше всего комитящие в Гитхаб. Много неожиданного

Программерия - это алхимия

Программерия, или что нужно знать программисту

Как стать программистом? Что учить программисту?

Наша профессия одна из сложнейших и каждая программа по своему уникальна. Кроме самого программирования как такового нужно обязательно знать множество других смежных вещей которые помогают конструировать ПО. Мы ещё плохо понимаем как правильно разрабатывать программы и каждый раз мы пытаемся предугадать её будущее изменение и много экспериментируем переосмысливая свой опыт. Всё это очень похоже на Алхимию.
И подобно как из Алхимии родилась Химия, также из Программирования рождается новая наука Программерия. Что это, и как она помогает современному программисту читайте в моей статье Программерия, или что нужно знать программисту.

Похожие статьи

Итак, вы решили стать программистом
Что нужно знать каждому программисту по версии Google! (eng)
Программирование — занятие не для каждого
Писать код уже не достаточно: обязанности современных back-end разработчиков
Как стать программистом?
Путь программиста: через что придется пройти джуниору, чтобы стать синиором
Путь программиста
Карта программиста
Что должен знать html-верстальщик?
Почему разработчик — не инженер

Что сегодня посмотреть программисту вместо сериалов

Ну как там у вас воскресенье проходит? Если есть свободное времячко я вам советую посмотреть эти видео которые мне оказались интересными.

Иконоборцы (Iconoclasm — Ted Neward)

Интересный рассказ Тэда Ньюварда про тех инноваторов которые нарушали сложившиеся каноны и стереотипы и в итоге оказывались правы.
Начинается с того что компьютеры уже вообщем-то умнее нас, хотя мы их презираем и чтобы выжить в эволюционной гонке нам нужно самим менятья. ИМХО непонятно к чему это было сказано. Дальше раскрыл тему что вообще-то мы склонны соглашаться с коллективом и не протестовать и всячески этого избегаем.
Но находятся те кто бросает вызов и может либо преуспеть либо очень сильно проиграть.
Что общего между иконоборцами и что отличает этих людей от остальных? Какую стратегию выбрать.
Очень советую вообщем даже если у вас нет желания высовываться

Языковая сложность — Александр Пиперски

Небольшой рассказ лингвиста о том как пытаются сравнивать естественные языки по сложности и почему в этом зачастую нет смысла.
Довольно интересно если проводить аналогию с языками программирования.Это хорошая метафора, например Китайский — как ассемблер в котором вместо иероглифов машкоды. Но есть, конечно множество различий использования естественных языков от компьютерных. Например в компьютерных тебе очень важна структура, однозначность и возможность легко изменять написанное. В естественных языках важнее скорость передачи мысли и всегда имеется контекст из которого можно востановить значение.

«Uncle» Bob Martin — «The Future of Programming»

Дядя Боб автор программисткого бестселлера Clean Code рассказывал почему-то не про будущее программирования, а про прошлое начиная с деятельности Алана Тьюринга и привёл к мысли что мы, программисты, управляем миром. Он разобрал тему почему мы так плохо программируем — оказывается дело в том что рост количества программистов экспонеционален и поэтому ежегодно примерно половина программистов имеет опыт меньше пяти лет и делают множество ошибок. И нам не хватает некой дисцпилины что рано или поздно приведёт к огромной трагедии с человеческими жертвами. И тогда государство введёт ограничения и регуляции на нашу профессию. Вообщем в этом он и видит мрачное будущее программирования.

Виктор Полищук — Legacy: как победить в гонке

Виктор очень матёрый программист поработавший в «кровавом энтерпрайзе забирающем душу» рассказывает что вообще-то вы должны радоватся если работаете на старом и состоявшемся проекте — ведь он успешный и радует заказчика. Дальше он рассказывал какие базовые меры можно предпринять чтобы оживить проект и двигать его дальше.
Однозначно ценный опыт для программистов, жалко что мало информации по этой теме появляется

Парное программирование — Сергей Бережной

Очень просто, для джуниоров, толково и наверное почти полностью раскрытая тема как работать в паре и почему иногда это работает просто супер а иногда совсем нет.

Командная строка Unix — Виктор Ашик

Виктор очень хороший лектор и доступно рассказывает про основу основ для программистов — командую строку. Тема кажеться банальной и неинтересной, но даже я будучи уже более менее опытным в этом вопросе много полезного для себя узнал.

Decision Tables and Decision Trees

Небольшая лекция про то как использовать таблицу принятия решений. Я не знал раньше о таком но на практике у меня было несколько случаев когда мы долго обсуждали в команде поведение программы при многих факторах и было сложно объяснятся друг с другом. И последний раз мы на доске прям расписали что-то похожее на такую таблицу. Если бы я раньше знал о таком простом и эффективном способе я бы сэкономил много времени

Евгений Кривошеев — Осознанность проектирования

Мы много говорим про архитектуру систем но что она есть сама по себе мы слабо представляем.
Узнал про Cynefin Framework, потом как нибудь изучу его.

Николай Алименков — Современный взгляд на реализацию классических дизайн-паттернов в Java

Патерны проектирования появились давно как некие конструкты которые мы делаем в коде но при этом не можем явно выразить ограниченным синтаксисом языка. С тех пор много воды утекло, часть патернов себя отлично зарекомендовали другие же стали практически антипатернами. Да и синтаксис Джавы очень сильно обогатился и теперь стоит их пересмотреть с учётом нашего опыта.
Отличная лекция для более менее опытных программистов.

Антон Кекс — Цифровая подпись в Java, Россия vs Эстония

Эстония проделала огромную работу в информатизации общества и эстонец Антон Кекс рассказал как у них всё это работает и как внедрять нам.
Очень круто и просто рассказал про такие сложные вещи да ещё и покодил. Я прям захотел себе получить электронное резеденство Эстонии

Презентация интернет магазина Алексея Земскова ZemsMarket.ru

Сам владелец интернет магазина инструментов рассказывает почему его сервис лучший и как он работает. Я понимаю что вам это может показаться не интересным, но это просто потрясающе, поверьте и посмотрите. Я хочу эту презентацию увидели все бизнесмены потому что мне иногда просто хочется кричать от их бездумья.

Show me yours…

В Британии рассматривают закон дающий полную свободу спецслужбам в просмотре личной переписки, записи звонков и вообще полностью уничтожающий какую либо приватность.
Но люди не паникуют и даже одобряют, ведь это же доброе и мудрое государственные комиссары боряться со злыми террористами, а их не вообще касается. Но вот одна девушка решила проверить что будет если коснёться?

Лучшая мышка для программиста — это трекбол и трекпоинт

Ежедневно мы так много работаем с мышью что она уже является продолжением нашей руки. Даже спустя десятилетия производства мышей выбрать подходящую довольно сложно. Осуждения мышей на программистских форумах не утихают. Лично я уже много лет пользуюсь не мышью, а трекболом Logitech M570 wireless trackball, вместе с ThinkPad клитором (трекпоинтом) и они так классно дополняют друг друга что уже просто не понимаю как программисту можно пользоваться чем-то другим.
Трекбол Logitech m570

Купил как только начался туннельный синдром в запястье на правой руке и он прошёл. Но из-за клавиатуры чуть позже начался на левой руке, поэтому стараюсь лишний раз ею не пользоваться и полечил её в клинике ультразвуком, вроде пока прошло.
Боли в суставах большого пальца я не замечал но всё таки вспомнил что да, действительно бывали. Т.е. проблема есть но не очень критична. Хотя тут может быть очень индивидуально.

Но кроме того что рука отдыхает самое крутое что трекболом можно пользоваться на любой поверхности и не надо ёрзать. Т.е. нет этого противного звука скрежета по столу, не нужно ковриков для мышки или гладкого стола. Особенно это круто когда ты работаешь за ноутбуком в постели: положил его на живот или скомканную простыню и работаешь себе спокойно. Я даже успешно поработал едя несколько часов микроавтобусе при сильнейшей тряске.
Из-за того что ты не елозишь по столу получается тише но, у него довольно громковатый клик. Причём у клика звук странный — «двойной» ты слышишь клик как опустилась клавиша и ещё клик как поднялась.

Чистить приходится, но в отличии от шариковых мышек он засоряется намного реже, потому что загрязняется только жиром с пальца а не грязью со стола. К тому же вычищается намного легче, потому что грязь не на роликах а на пластиковых прижимателях шарика.
Ещё из проблем: у первого трекбола стал вместо одного клика, срабатывать как двойной. Что-то с чувствительностью кнопки случилось или конденсатором каким-то. Это бесило люто — жмёшь на крестик закрыть программу она закрывается и невольно нажимаешь на крестик закрыть следующей программы.
Из-за того что я перешёл с удалёнки обратно в офис я его каждый раз вытаскивал и носил на работу. От постоянных вытаскиваний у меня сломался USB ресивер. Вообще говоря, нужда в отдельном ресивере это плохо. Во первых он занимает USB порт, а у меня на ноуте их только три а на рабочем стационарном компьютере он вообще сзади системника. Хотелось бы Bluetooth но вроде как для блютуза нужно чтобы полностью система загрузилась и драйвера.

Ресивер можно найти в интернете и купить отдельно (хотя дороговато), но я просто купил ещё два трекбола — один домой другой работу. Найти и купить эти трекболы — отдельная печальная история. Их вроде сняли с производства и я выискивал по всему интернету.

Но у рабочего тоже по-моему периодически срабатывал двойной клик. Так-что это может быть их родовой травмой.

Ещё из неприятных моментов: когда падает на пол вылетает и укатывается шарик. Случается редко, обычно в путешествиях но очень неприятно его искать.
Отдельно мне не нравится что нет средней кнопки, а кликать роликом очень жёстко и неприятно.
Ещё тут нужно сказать что трекбол тяжёлый, большой и занимает больше места. Это может быть неудобно если у вас какой нибудь нетбук и вам хочется иметь маленький вес и размер. У меня например он полностью занимает боковой карман рюкзака, а например, в карман штанов он вообще не поместиться.
Но из-за того что он большой, ладонь полностью ложиться на него и ощущения приятнее. Т.е. это требование эргономики.

Кстати, в отличие от обычных беспроводных мышей, которые из-за батареек становятся тяжелее больше и неудобнее ими ёрзать, для трекбола это проблемой не является.

Ещё один неприятный момент: когда парно программируешь с коллегой, он пытается поелозить трекболом как мышкой:) Поэтому у меня за компьютером лежит ещё отдельно «гостевая» мышка, и кстати получается удобнее — нужно куда-то навести курсор, ты не просишь коллегу дать мышку а просто сам наводишь. Поэтому если вы работаете в офисе то вам от традиционной мышки всё равно не избавиться. Но и даже если у вас будет две обычные мышки это сильно улучшит удобство в парном программировании.

Ещё на трекболе есть две кнопки для броузинга «Вперёд по истории» и «Назад». Но я ими не пользуюсь. ИМХО намного было бы удобнее если бы кнопки работали как «Page up» и «Page down». Может их можно перемапить но у меня руки не доходили.

Очень важный момент: привыкание к нему после мышки было очень быстрым, уже за день я спокойно пользовался. Точность очень хорошая, возможно даже лучше чем у мышки. Но! Скорость перемещения меньше чем у мышки. Поэтому для стрелялок, типа Халвы или Контры, он не подходит, но для неспешной и долгой работы, как например за стратегиями типа Эпохи Империй он просто отличный.

Батарейки держат очень хорошо, точно больше двух лет и я ещё ни разу не менял. Дальность приёма ресивера огромна — через две комнаты ловит отлично.

Итак, плюсы:
* Не болит кисть руки
* Работает на любой поверхности, включая просто на весу что можно использовать во время презентации.
* Не нужно ёрзать по столу
* Хорошая точность
* Привыкаешь быстро
* Батарейка практически вечная
* Беспроводная
* Эргономичная

Минусы:
* Очень часто и довольно быстро начинаются проблемы с двойным кликом. Умельцы перепаивают кликер.
* Дороже чем обычные мышки
* Только для правшей
* Может начаться боли в суставах большого пальца
* Скорость перемещения ниже — не годится для динамичных игр
* Периодически нужно чистить под шариком
* Шарик при падении вылетает
* Пользоваться сможете только вы, поэтому если вы парно программируете нужно вторую мышь держать.
* Шумновата
* Нужен ресивер
* Неудобная в транспортировке
* Тяжелее найти

Варианты которыми я не пользовался, но может вам подойдёт:
* Для левшей или тех у кого болит большой палец есть трекбол Logitech MARBLE.
* Некоторые пробуют вертикальные мышки, например DELUX M618 Wireless Vertical Laser Mouse

Как определить ставить ли новую Windows или любую другую программу

Эволюция Корзины

Среди IT-специалистов распространено мистическое убеждение:

Считается, что каждая четная версия Windows выходит у Microsoft неудачной, а каждая нечетная, наоборот, хороша. Здесь стоит вспомнить критику Windows Millenuim, Windows Vista и Windows 8, которые были четными, а также успех Windows XP и Windows 7. Microsoft пропустила цифру «девять», сделав Windows 10 нечетной в этом списке. Впрочем, некоторые специалисты «девяткой» считают Windows 8.1, что переводит «десятку» в совсем другую категорию.

На самом деле мистики никакой тут конечно же нет. В Майкрософте работают тысячи лучших инженеров, ну ладно, шучу, конечно не лучших, но в принципе уже горько опытных. Над ними ещё десять звеньев всяких менеджеров среднего звена, маркетологов и прочих бабкорубов. Поэтому по теории больших чисел результаты из труда не случайны а имеют определённую закономерность. Почему так происходит чётко видно по кнопке пуск — в один релиз её убрали, а на следующий, получив гневный фидбек, вернули.
Всё выстраивается так что в одном релизе вводят новую или меняют старую функциональность, затем на следующий релиз её либо убирают либо меняют и стабилизируют. Просто почитайте что какую судьбу предсказывали восьмой винде:

Вспоминаем: после XP люди ждут очень перспективной ОС с ещё более красивой графикой, гиберацией, повышенной безопасностью и возможностью не перезагружать комп после установки программ или драйверов. Появилась Vista. Люди негодуют — глюки, производительность никакая и т.п.
Разработчики чешут репу, многое отключают в системе чтобы не мешало, исправляют баги, что-то добавляют и выпускают семёрку.
Пользователи смотрят — производительность лучше чем у висты, радуются и забывают, что XP работала быстрее (момент немного спорный) и требовала намного меньше ресурсов для компьютера.
microsoft начинают воевать со старушкой XP, так как она остаётся неплохим конкурентом семёрке и активно используется в Китае вместе с IE 6

Сейчас повторяется то же самое: обещают поддержку ARM процессоров и телефонов, совместимость со старыми приложениями и возможность играть в игры для Xbox, революционный интерфейс и т.п.
Когда восьмёрку выпустят внезапно поймут что погнались за двумя зайцами, есть много багов, на телефонах тормозит и т.п. и т.д.
Разработчики почитают гневные реплики пользователей и к следующей (наверно, девятой) версии всё исправят. Судя по всему, ещё лет пять-десять как минимум семёрка будет оставаться одной из используемых ОС для компьютеров.

Впрочем, неудачная (если вдруг) Windows 8 не понравится некоторым пользователям, и они перейдут на linux или продукцию компании Apple, которая в последнее время имеет свободных денег больше чем microsoft. Не будем забывать и про Google, которые, в принципе, тоже могут что-то выпустить.
(с) http://forum.boolean.name/showthread.php?t=15523

ИЧСХ и всё прямо так и случилось!

Молоток как эволюция Виндовс

Поэтому есть релизы стабильные или успешные а есть тестовые или неуспешные. Понять успешность можно лишь по статистике как быстро на него переходили («адоптировали»). Я например за вистой и восьмой виндой даже не поработал. Иногда когда вижу у кого-то удивляюсь что это такое.

И это касается не только Виндовс но и других крупных продуктов с длинным релизным циклом, обычно у «коробочных» типа Microsoft Office. Но есть интересный пример версии Java:
1.0 Её даже не публиковали, так что скипнем
1.1 Первая опубликованная, ажиотажа не вызвала. Помещалась на дискету. Можно считать релиз неуспешным.
1.2 Появились коллекции, JIT, Swing, Java plugin и аплеты (а тогда это был крутяяяк) — количество кода библиотек выросло в три раза и уже на дискету не влезало. Успех!
1.3 Вообще ниочём, багфикс. Неуспех.
1.4 Регекспы, уродский логинг АПИ, но зато NIO, криптография, XML парсинг. Вроде ничего такого особого, но Успех. Началось активное использование для веба, сформировались библиотеки и фреймворки, появились первые JVM языки Groovy и Scala.
1.5 Синтаксический сахар (статик импорты, аннотации, for each, enum, varargs) но главное что появился внятная Java Memory Model и Concurrency. Внезапно успех, хотя почти на всех старых джава проектах этот на этот сахар ещё не переписали. Но грамотно заложенная и чётко специфицировання JMM сыграла
1.6 Последний релиз Sun’а ничем не интересный кроме внятных процессоров аннотаций. Всё замерло на этом релизе надолго и все только и любая магия так и делалась на аннотациях пока по ночам мы плакали в подушку мечтая о лябдах. Тем не менее релиз оказался довольно стабильным и всё работало много лет, так что всё таки успех.
1.7 Первый релиз Оракла. Ничего интересного, просто промежуточный перед восьмой джавой. Неуспех.
1.8 Ляяямбдыыыыы! И наконец-то внятный Date API. Все перешли на восьмую почти мгновенно. Успех!
1.9 Уже на выходе, по сути будет только улучшена модульность что конечно тоже сверхважно для древних энтерпрайзных монолитных проектов, но хипстеры уже всё говнокодят на микросервисах где всё проще переписать и не нужно сильно запариваться архитектурой. Так что особо ажиотажа особого не будет.

Итак, тут закономерность чётности версий прослеживается ну только при очень большом старании. Но если посмотреть не каждую вторую, а каждую третью версию то можно заметить что 1.2, 1.5 и 1.8 то эти релизы были особенно успешными. Причём даже не так, они наделали шума. В основном из-за того что в них появлялись новые «Вау» фичи. И это принципиальное дело кстати.
Представьте себя менеджером продукта. У вас есть некие срочные задачи — например секьюрити уязвимости, есть задачи по долгосрочному плану улучшения архитектуры проекта, но периодически вам нужно добавлять в продукт что-то такое что снова привлечёт внимание пользователей и даже те кто пользовался древней версией и довольны захотели бы купить новую версию. Например в случае с Джавой это новые возможности языка.
Т.е. есть разные задачи с разными характеристиками по важности и срокам и при грамотном менеджменте ты их учитываешь. Если их граммотно разложить и расписать на графике то можно найти множество таких закономерностей и предсказывать свойства следующей версии.
Поэтому можно смело предсказывать что например в десятую версию Джавы будут внесены какие-то вау фичи.

Но что самое интересное, если посмотреть на минорные версии джавы то там это правило чётности уже заметили давно и с пятой джавы даже приняли как схему версионирования: чётные релизы содержат новый функционал, нечётные багфикс и секьюрити апдейты. А позже ещё и усложнили настолько что даже пришлось на конференциях объяснять как теперь с этим разбираться

Но не всегда четно-нечётная схема усложняется, многие как раз наоборот стараются перейти к более частым и но последовательным и плавным rolling releases и continuous delivery:

Между сериями 1.0 и 2.6.x ядро Linux использовало нечётные номера для бета-версий, и чётные — для стабильных. Например, Linux 2.3 был серией в разработке, а Linux 2.4 — серией стабильных релизов, в которую перерос Linux 2.3. В номере релиза Linux kernel сначала писался номер второстепенной версии, а затем номер релиза в возрастающем порядке. Например Linux 2.4.0 → Linux 2.4.22. После релиза 2.6 в 2004 году Linux больше не использует эту систему, теперь цикл релиза намного короче. Сейчас они просто увеличивают третье число, используя при необходимости четвёртое.

Тоже самое кстати происходит и с броузером Chrome а позже и с Firefox’ом. Какая версия Хрома уже никто не знает (у меня например уже 16.3.0.6796). Для обеспечения надёжности они просто создали отдельную «вечную бету» которую могут себе поставить и протестировать все желающие и Feature toggling.

Непрерывная поставка
Таким образом цикл релиза и фидбека ускорился и подобные схема рано или поздно будет использована почти во всех программах.
И вы не отставайте😉

Хороший институт не даёт хорошего образования

Где лучше учат, в Стенфорде или в академии ШАГ а может и вовсе на дешёвых курсах?

Не имеет никакой роли. Вот прям совсем. Как бы тебе не разжёвывали, тебе всё равно придётся самому это «проглотить». Чему бы тебя не учили — почти невозможно придумать идеальную программу которая подходит всем. Как бы хорошо ты не запомнил — ты всё равно забудешь без практики.
Невозможно сказать что факультет плохой или хороший. Может быть хороший преподаватель — но его «хорошовизна» может определятся только его способностью определить что нужно студенту и подогнать обучающую программу под него. Это то что называется «объясняет».
Более того, может быть реально прекрасный преподаватель, но его стиль обучения не совпадает со стилем обучения студента.
Давайте я объясню подробнее что я имею в виду. Например у меня стиль обучения такой: я не читаю никаких книжек и вообще ничего. Я тупо «интуитивно» пытаюсь угадать как должно быть и пытаюсь это сделать.
Я делал довольно сложные программы, и при этом неплохо написанные и удачно декомпозированные при этом вообще не понимая ООП. Более того, у меня даже книжки не было по Делфи.
Но со временем у меня вдруг включается другой режим — и я вдруг вчитываюсь в матчасть и подробно её изучая. При этом когда читаю документацию я её как бы сканирую и пытаюсь найти «потаённые» штуки которые могут мне пригодится.
Я пытаюсь первым делом понять как и для чего использовать эти знания, а потом уже изучаю их глубже только ради того чтобы узнать как можно ещё лучше их использовать. Сами по себе мне эти знания не очень-то интересны.
Т.е. мой стиль обучения мне помогает в моей работе программиста — я так быстро осваиваю технологии и перехожу с одной на другую. Но мне бывает очень тяжело изучить что-то в деталях.
И я прям совсем не могу быть, что называется, учёным. Мой мозг бунтует и отказывается принимать знания если я не понял как конкретно их применять. И я бы никогда бы не смог заниматься наукой ради науки. Люди вроде Буля, который придумал дискретную алгебру, для меня какие-то прям супергерои — они придумали что-то, что нашло применение только столетия спустя.
Теперь смотри, я такой студент, я мотивирован, я что-то там может даже соображаю. Но мой преподаватель даёт информацию подробно разжёвывая с объяснением. Например мы проходим побитовые операции. Мне они не интересны, но мне подробно и очень хорошо рассказывают все эти нюансы. Я начинаю скучать и тупо вырубаюсь на лекции.
С формальной точки зрения — я получил отличное образование. С практической полный ноль.
Я был бы неуспевающим и меня бы отчислили.
Я не очень ковырял эту тему но видел какие-то более менее вменяемые объяснения что такое Стиль обучения в соционике и на Википедии.
В действительности я насколько понимаю эта область граничит с нейробиологией, психологией и педагогикой и довольно слабо изучено.
Поэтому нужно просто признать — сегодня наверное никто не знает как правильно учиться и учить.
Это настолько индивидуально и требует длительного наблюдения что с этим смогут справляться только когда технологии Big Data помогут проанализировать и делать какие-то статистически подтверждённые утверждения как эффективно учить.
А теперь умножьте это на компьютерные науки которые сегодня являются во многом синтетическими а не природными, а значит могут сильно меняться и отличаться. И во много являются «алхимией», «шаманством» или «искусством», т.е. мы признаём что тупо не знаем как оно работает и должно проектироваться.

Как определить что вы учите примерно правильно и примерно оптимально, по крайней мере для определённой категории людей? Очень просто — если вам платят значит вы в правильном направлении. Если вам платят значит ваши студенты всё таки имеют больше шансов на устройство. Если они устраиваются значит они могут справляться с работой.
Рынок, рынок всё решает.

По мотивам обсуждения на форуме Стремительный рост КА ШАГ