Вот интересно даже

Кто заказал вебинар по трансляции кода из Matlab с упором на процессоры Миландр?

https://exponenta.ru/events/avtomaticheskaya-generatsiya-koda-dlya-ekb-milandr

ЕСПД и программисты

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

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

Примерно тут возникает еще одна проблема — «код и документация» нужны заказчику в удобоваримом для него виде. Скажем, «код валяется в разных местах на диске у Васи, документация — в виде обрывков бумажек в столе у Пети» ни одного заказчика не устроит; «исходники и Javadoc лежат на гитхабе там-то и там-то» — приемлемый вариант для «технарей»; «все документы по проекту находятся в CVS-системе фирмы, а также записаны на компакт-диски и находятся в двух разных помещениях архивов» — вариант повышенной энтерпрайзности, ну и так далее.

И тут мы приходим к одной поучительной истории — про ЕСПД. Идея 19 и 34 серии ГОСТов, если вдуматься — это решение проблемы, описанной в предыдущем абзаце. Если говорить на языке более современных подходов к разработке ПО — типа RUP или OpenUP — то они описывают «артефакты», которые должны возникнуть в ходе разработки программы или автоматизированной системы, и требования к содержанию и оформлению этих «артефактов», позволяя заказчику, разработчику и потребителю ПО говорить «на одном языке».

Проблем с ЕСПД две — откровенный саботаж всякого процесса документирования своего творчества со стороны программистов и (как позже увидим, непосредственно вытекающая из этого) устарелость стандартов. Но начнем мы все же с саботажа. Давайте попробуем «изготовить» полагающийся по ГОСТ 19.401-78 «Текст программы». Поймайте программиста и попросите у него «текст программы». Ответом вам будет либо набор файлов (хорошо, если он сопровождается каким-нибудь Makefile), либо, если вы используете много «чужого» кода — долгая дискуссия, где заканчивается ядро Linux и начинаются ваши доработки. Дальше вы смотрите на ГОСТовские требования и понимаете, что распечатка ядра Linux или какого-нибудь веб-фреймворка на бумаге — это, конечно, прикольно — но отдел технической документации у вас это не примет.

Дальше выясняется — со слов коллег, сдававших сделанную по ЕСПД документацию раньше — что архив и нормоконтроль удовлетворятся сделанным в Word документом, содержащим что-то, похожее на исходники программы. Не вопрос! — думаете вы, и лихим Ctrl+C — Ctrl+V набиваете вордовский шаблон неработающими исходниками. Собственно, где-то на этом этапе в 1937 году вас бы ждал расстрел за подлог документов и саботаж (кстати, вы никогда не задумывались, что сокращение ИТР обозначает одновременно инженерно-технических работников и иностранные технические разведки?) — но сейчас времена более вегетарианские. и за такое очковтирательство никому ничего не будет.

Маленькое отступление — если бы вы не слушали «более опытных» коллег, а пошли бы в архив с тортиком, то вы смогли бы выяснить, что записанный на компакт-диск zip-архив с исходниками тоже сойдет. Впрочем, особо красноречивые товарищи могут попробовать научить работающих в архиве девушек пользоваться TortoiseHg.

Примерно так же происходит подготовка любых других документов «по ГОСТ» — вместо минимально читаемого Javadoc «Руководство программиста» будет куцей компиляцией форменного бреда; «Руководство системного программиста» будет описывать все, кроме того, что действительно нужно. В конечном итоге на написание документации будет посажена «девочка», совершенно не задумывающаяся о сути производимой работы, но неплохо умеющая писать формально удовлетворяющую требованиям нормоконтроля документацию.

priplyli

Поздравляю, вы окончательно приплыли! Через некоторое время процесс очковтирательства при подготовке документации будет отлит в граните зафиксирован не только в «организационной памяти», но и в стандарте предприятия, и из необходимого этапа в жизни программного продукта превратится в бессмысленную и неприятную повинность (впрочем, «девочка» для этого у вас уже есть).

В принципе, с чем-то подобным столкнулись и обычные инженеры, конструктора и так далее — но в отличие от программистов, там довольно быстро осознали, что стоит привести ГОСТы в соответствие с реальностью XXI века — поэтому в ЕСКД где-то в начале 2010-х легализовали, к примеру, «электронный документ» (собственно, ГОСТ 2.051-2006 приняли еще раньше, как несложно догадаться — в 2006). Технически продвинутые программисты — наоборот, предпочитают оставаться в реалиях 1970-х годов по причине полной неспособности взаимодействовать с «нехорошими бюрократами». Остается их с этим поздравить.

PS Написано по мотивам личного опыта автора, your mileage may vary.

Интересно, как это называется?

Смотрю тут один опенсорсный проектик на гитхабе и понимаю, что в Cisco работают такие же индусы, как и везде (хотя нет, кое-где за такое могут и уебать):

https://github.com/cisco/ns3-802.11ax-simulator/blob/master/ns-3.26/src/wifi/model/rrm-wifi-manager.cc

Совершенно шикарны строки со 149 по 155, да и все их многочисленные копипасты. Поневоле задумываешься, как же в принципе может более-менее стабильно работать современный софт и тем более железо, разработанное «клоунами под руководством мартышек».

PS Посмотрел профили указанных в заголовке индусов на линкедине. Сильно опечалился.

Ще не вмерла Java (но вже смердит)

Интересно, а автор этого Java 8 Tutorial понимает, насколько смешной он взял эпиграф?

https://winterbe.com/posts/2014/03/16/java-8-tutorial/

Кто все эти люди?

Увидел на Stackoverflow шедевральный вопрос — как на питоне посчитать коэффициент корреляции Пирсона:

http://stackoverflow.com/questions/3949226/calculating-pearson-correlation-and-significance-in-python/5713856

Ответы типа «используй SciPy/NumPy/WhateverPy» в принципе понятны — но кто поставил 12 «лайков» ответу пользователя compski?

import math

# calculates the mean
def mean(x):
    sum = 0.0
    for i in x:
         sum += i
    return sum / len(x) 

# calculates the sample standard deviation
def sampleStandardDeviation(x):
    sumv = 0.0
    for i in x:
         sumv += (i - mean(x))**2
    return math.sqrt(sumv/(len(x)-1))

# calculates the PCC using both the 2 functions above
def pearson(x,y):
    scorex = []
    scorey = []

    for i in x: 
        scorex.append((i - mean(x))/sampleStandardDeviation(x)) 

    for j in y:
        scorey.append((j - mean(y))/sampleStandardDeviation(y))

# multiplies both lists together into 1 list (hence zip) and sums the whole list   
    return (sum([i*j for i,j in zip(scorex,scorey)]))/(len(x)-1)

И прошло целых три года, прежде чем Николай Фоминых сподобился написать крайне токсичный по нынешним понятиям комментарий «ты мудак, тебе надо оторвать руки, а клавиатуру засунуть в жопу, чтобы ты больше не мог написать ни одной строчки кода» «У этого способа ужасающая сложность и низкая производительность на списках из 500+ элементов».

Так вот — ладно, я не регистрируюсь на SO, потому что влом — но кто-то же проходил мимо этого образца говнокода, и за несколько лет так никто и не обложил хуями автора. Почему?

Еще один сборник задач по программированию

Наткнулся на опубликованные на сайте 57 школы «листочки» с задачами по программированию для математических и биологических классов:

https://prog.sch57.ru/

Это подборка из достаточно большого количества задач, укладывающихся в содержание хорошего школьного курса информатики «с программированием» (Python, основные алгоритмы, немного разной экзотики от machine learning до представления о веб-программировании) — к сожалению, на сайте она разбита по годам и классам, поэтому собрать курс целиком (или даже несколько — кажется, у «математиков» и «биологов» программа слегка отличается) в более-менее адекватном порядке может быть слегка затруднительно. По сложности — где-то между Pythontutor и книжкой Шеня. Из достоинств — задач больше, чем на Pythontutor, и в отличие от книжки, здесь есть задачи на «элементарные» темы. Есть критерии оценок — например, из листочка «Строки» на тройку надо решить 5 задач из 12, на четверку — 8, на пятерку — 10. Пользоваться для переворота строки всякими дебильными способами в явном виде запрещено, что не может не радовать.

Мир должен знать, что я пью

Так, передо мной 0,7 Havana Club, полторашка колы и исходники микрокода для процессора 1839 серии. Хз, что из этого получится, но явно что-то плохое :)

Кружевных трусиков псто

Чуваки и чувихи, а что вам показывает гуглопоиск первым результатом на запрос «C string»? Руководства по программированию или трусы оригинальной конструкции?

С праздником!

Очень оригинально решил поздравить российских программистов с государственным праздником Gitlab:

https://gitlab.com/gitlab-com/www-gitlab-com/issues/5555

Если коротко — то предложили выставить на мороз сотрудников из России и Китая — а то они могут подсмотреть какие-то секреты у некоего неназванного «customer considering using GitLab.com». Ну я думаю, перечень таких «customer considering using», ради которых Гитлаб готов делать все, что угодно — не такой большой. Если вспомнить еще и недавнюю историю с «телеметрией» для платных пользователей — то ну его нахрен, такой гитлаб?

Про Agile

Навеяно беседами (раз, два) в фейсбуке, в которых железячники и к ним примкнувшие гнобят программистов за общую инфантильность и неспособность в предсказуемые сроки выдавать работающий результат. Так вот, хоть я и зарекся писать про TU D-stadt — что взять с убогих? — но не могу пройти мимо темы того, как в немецком программистском образовании освещены методологии разработки программного обеспечения. Их обзору посвящена целая лекция в конце первого семестра «общей информатики» (где учат в основном каким-то азам Java, да и тем плохо).

Краткое содержание лекции — «водопад это плохо, много ненужного бюрократизма, чуть получше — спиральная и V-модель, но истинное «наше все» — это гибкие методологии, Agile и прочий Scrum». Под стать ей — и вопросы в итоговой экзаменационной работе — например, «назовите недостатки Waterfall model». Напомню, что лучшее средство для того, чтобы студенты усвоили какую-то непреложную истину — вынести ее на экзамен, а в такой вот форме — будьте уверены, запомнят они именно недостатки.

Пожалуй, неправильно будет обвинять профессора в какой-то злонамеренности, он вроде бы хороший чувак, но ни дня не работал в «индустрии» — так что просто вынужден некритически пересказывать модные сейчас штуки про «гибкие методологии разработки». Что получается на выходе — разумеется, такие же жизнерадостные программисты, обитатели страны розовых пони.

PS Да, что касается шуточек о том, что скоро курс информатики будут преподавать по материалам ebanoe.it. Уже! В Штатах в University of Massachusets Boston в рамках курса CS410 (Introduction to Software Engineering) читается лекция What to Expect from Tech Companies and their Hiring Processes — разъясняется, что такое галера, гребцы, хрюши и все такое (нет, до такого еще не дошли — но скоро, очень скоро все будет!).

Ретрокомпьютинга пост

Уволок с прошлой работы первое русское издание «Архитектуры компьютера» Таненбаума («Многоуровневая организация ЭВМ», издательство «Мир», 1979 год). Для развлечения читаю руководство по архитектуре VAX. На новой работе пришлось освежить в памяти, как работать с текстовым редактором vim.

Так, а что за последние 30 лет нового придумали?

Боже, какой ужас

Джаваскриптеры и не только решают задачку:

Написать функцию, которая для заданного отсортированного массива чисел (все числа разные) выводит текстовую строку диапазонов:

getRanges([0, 1, 2, 3, 4, 7, 8, 10]); // 0-4,7-8,10
getRanges([4, 7, 10]); // 4,7,10
getRanges([2, 3, 8, 9]); // 2-3,8-9

Кто-то создает на каждый чих по объекту, кто-то собирается писать «с помощью гугла и Stackoverflow», обсуждают читаемость простынки в несколько десятков строк с нетривиальной логикой… Ребята! Неужели приведенное на хабре решение более «читаемо», чем такое (простите, но это будет plain old C), написанное за десять минут?

void printRanges( int *arr, int len ) {
    int start = arr[0];
    int prev = arr[0];
    int printed = 0;
    int i;
    for ( i = 1; i < len + 1; i++ ) {
        if ( i == len || arr[i] != prev + 1 ) {
            if ( printed ) {
                printf( "," );
            }
            if ( start == prev ) {
                printf( "%i", start );
            } else {
                printf( "%i-%i", start, prev );
            }
            printed = 1;
            if ( i < len ) {
                start = arr[i];
            }
        }
        if ( i < len ) {
            prev = arr[i];
        }
    }
    printf( "\r\n" );
}

Да, тут есть возможные улучшения - но неужели решение из поста кажется более понятным?

Инсулиновая помпа по джаваскриптерски

Вместо «охуеть» следует говорить «я поражен»:

https://liamz.co/blog/im-a-cyborg-now-on-building-my-own-artificial-pancreas/ (пересказ на русском)

А также интересно посчитать количество способов, которыми залетные хакеры, Роскомнадзор или просто глюки оборудования могут уменьшить поголовье программистов на Javascript.

Борьба с карикатурным злодеем

Вот пишут, что в попытках помешать «нехорошей» Иммиграционной и таможенной полиции США некий программист удалил свой код с гитхаба.

https://www.theverge.com/2019/9/20/20876495/github-seth-vargo-pulled-code-chef-ice-deportations-trump-administration

Вообще для нормально организованного процесса разработки с использованием всякого левого опенсорса крайне желательно иметь свои, «локальные» копии всего софта, который может вот так просто взять и исчезнуть по желанию левой пятки какого-то там сомнительного программиста. В фирме Chef, подрядчике разных американских госорганов, разработка организована почти нормально — так как этот демарш привел к остановке работы всего на полтора часа. Разве что некоторые чуваки из Chef успели выразить в твиттере глубокую поддержку этому товарищу — на месте руководства фирмы я бы задумался о том, что они как-то неправильно понимают public interest (ради которого и следует работать, как учит нас IEEE-шный моральный кодекс).

PS Кстати, полномочия этой самой Иммиграционной и таможенной полиции впечатляют: например, она обладает правом потребовать разделегирования доменных имен в зонах .com, .net и .org:

https://www.theguardian.com/technology/2011/jul/03/us-anti-piracy-extradition-prosecution

Про «10x engineer»

Вот этим летом какой-то индийский чувак чувак написал в твиттере, что «для успеха стартапа» очень желательно найти «10x engineer» — то бишь программиста, который работал бы за десятерых, а «кушал» бы, желательно, за одного:

https://twitter.com/skirani/status/1149302828420067328

Индусу, конечно, напихали хуев в панамку — но вообще, «10x engineer» — это реальность, например, в модели COCOMO (Constructive cost model), применяющейся для оценки сроков разработки программного обеспечения (в частности, NASA сделало даже онлайновый калькулятор — впрочем, расчеты там довольно просты). Применимость ее, правда, ограничена — для того, чтобы посчитать сроки, нужно заранее как-то прикинуть количество строк кода в проекте, а этого знать заранее никто не может. Впрочем, в модели есть довольно забавная штука — набор множителей, увеличивающих или уменьшающих сроки в зависимости от разных факторов. Непосредственно к квалификации программиста можно отнести весь раздел Personnel Attributes, а заодно — два параметра из Project Attributes — Modern Programming Practices и Use of Software Tools. Если принять «стандартную» сложность проекта за единицу, то использование «лучших из лучших» проектировщиков-аналитиков и программистов с офигенным опытом даст снижение сложности до 0,71*0,82*0,70*0,90*0,95*0,82*0,83=0,23 — в 4,5 раза. А что будет, если брать специалистов уровня «ниже среднего» (но не самое дно — лучше, чем 15% худших)? Сложность проекта в человеко-часах возрастет до 1,19*1,13*1,17*1,10*1,07*1,10*1,10=2,24 — больше двух раз.

Собственно, вот здесь и видно, как возникает десятикратная разница — опытных (от 3 лет опыта с конкретной «платформой», и от 12 лет «вообще») высококлассных специалистов (10% лучших) сравнивают с малоопытными (меньше года) и низкоквалифицированными.

PS С другой стороны, сама по себе модель, где можно варьированием факторов изменить оценку сложности и продолжительности проекта в десять или даже хотя бы в пять раз — тоже штука довольно сомнительная.

Программирование: теоремы и задачи

Вот кстати, хочется рассказать о неплохой книжке по алгоритмам и структурам данных — «Программирование: теоремы и задачи» А. Х. Шеня (свободно распространяется в электронном виде, на бумаге несколько раз издавалась МЦНМО). Вот все знают книжки, скажем, Кнута (но мало кто их читал), Кормена (тут ситуация немного получше), Дасгупты или Скиены — а я хочу сказать, что эта брошюрка (320 страниц, на фоне среднего «айтишного» учебника в тысячу-полторы — это ни о чем) по глубине изложенного материала не уступает как минимум двум последним.

Особенность книжки — в изложении материала. Это не столько учебник/справочник, сколько задачник, построенный по логике «системы задач на листочках». Эта система применяется, скажем, во многих московских матшколах и состоит примерно в следующем — на каждую тему выдается список задач («листочек» — обычно они помещаются на лист формата A4), часть задач может иметь и самостоятельную ценность (как полноценные теоремы; иногда содержательные утверждения разбиваются на несколько подряд идущих задач). Сложность задач возрастает, для перехода к последующим листочкам надо либо решить текущий целиком, либо решить большую часть задач (в этом случае листочки могут содержать и нерешаемые задачи). Часть задач может разбираться «у доски» (прежде всего что-то основополагающее), остальные предназначены для самостоятельного решения.

В общем, получился такой сборник задач по алгоритмам для старших школьников или студентов-младшекурсников, не отягощенный излишней сложностью (как тот же Кормен), но и не скатывающийся в сюсюкание, как Бхаргава. Использовать как справочник проблематично, а как набор задач для самостоятельного понимания этого всего — в самый раз. В непонятных местах можно дополнить книжкой Дасгупты или Скиены.

PS Издание 90-х годов сопровождалось совершенно шикарным текстом — «Не покупайте эту книгу!» (кликабельно):

dont-buy-this-book