Тег ‘программирование’

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

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

99 cans of beer on the wall

99cans

…take one down, pass it around!

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

Очень оригинально решил поздравить российских программистов с государственным праздником 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.

Режим шимпанзе

chimp

Кажется, такой режим есть, и активируется при помощи 0,5 водки.

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

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

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

С днем программиста!

13-september-programmer-day

Ставить лайки можно/нужно тут: https://twitter.com/i_am_romochka/status/1172391844354768896.

Про “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

И еще про айтишные конференции

Оцените вот это обращение Дмитрия Назарова (”лжец и мудак Назаров” – это как раз он) к организаторам конференции “Стачка”:

https://twitter.com/nazarov_tech/status/1166728106545229824

Безотносительно “Стачки”, Савельева и так далее – это же чистой воды текст в жанре “такой-то отклоняется от линии партии, допускает высказывания, порочащие советский строй”.

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

PHP Central Europe 2019

А вот пишут, что конференцию PHP Central Europe 2019 отменили из-за того, что все выступающие – хуемрази white males:

https://2019.phpce.eu/en/

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

https://twitter.com/KarlLHughes/status/1151525811616387073
https://steemit.com/php/@crell/skipping-php-ce-this-year
https://markbakeruk.net/2019/07/24/withdrawal-from-speaking-at-phpce-2019/

Впрочем, немного не понимаю причин, по которым программистов на PHP не считают handicapped minority (а половина пхпшников – просто натуральные пидорасы в плохом смысле).

Чуть-чуть про обучение программированию

Вот говорят, что функциональное программирование – это непонятная фигня, что оно оторвано от жизни, все такое. Но чуваки, я сам лично видел, как девочка-филолог, особо компьютерами никогда не интересовавшаяся, самостоятельно “изобрела” конструкцию вроде лисповского map. А вот если верить лекциям Кушниренко для преподавателей (параграф 8) – к “изобретению” цикла человека надо специально подводить мелкими шажками.

Кстати, по поводу кодерских задачек на собеседованиях

Вместо того, чтобы предлагать в 100500 раз перевернуть строку, отсортировать массив и тому подобное – придумайте аналогичную задачку, где фигурирует файл на 100 Гб (скажем, это какой-нибудь лог). Например:

На диске лежит файл log.txt объемом 100 Гб, в котором записаны строки вида UUID,DD-MM-YYYY,hh-mm (например, 123e4567-e89b-12d3-a456-426655440000,01-12-2018,01-35), строки разделяются последовательностью CR-LF. Имеется компьютер с разумным размером оперативной памяти (скажем, 16 Гб), отсортируйте файл по UUID-ам.

Очень оживляет обсуждение.

Главное правило разработки под Android

Купите себе несколько девайсов ценовой категории “днище” (бренды вроде Prestigio, Irbis, Digma, которыми завалены магазины) – потому что именно это самое днище будет максимально популярно у пользователей, а заодно – страдать от самых невообразимых программно-аппаратных глюков.

Ну и чтобы два раза не вставать – а что нужно, чтобы писать софт для iPhone/iPad?

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

У них в 1985 году:

With NeXT, Jobs went back to a project he had contemplated for Apple in August 1985. While touring universities to boost Mac sales, he had met Paul Berg, a Nobel Laureate in chemistry. Paul was frustrated with the cost of teaching students about recombinant DNA in wet laboratories. It would have been cheaper to simulate them. It seemed there was a market for 3M (One Megabyte of RAM, a Megapixel display and MegaFLOP performance) workstations targeted at universities and students. NeXT set itself to build something powerful yet cheap enough that college students could afford it.

http://fabiensanglard.net/gebbdoom/index.html

У нас в 1985 году:

В апреле 1985-го после визита на завод только что избранного Генеральным секретарем ЦК КПСС Горбачева было принято решение создать на базе ЗИЛа образцовое предприятие по системам автоматизации проектирования. До конца лета в напряженном режиме прорабатывались различные варианты реализации этой идеи. Для удовлетворения потребностей завода в САПР необходимы были 400 рабочих мест типа VAX-70 (графический дисплей с разрешением в 1 млн. пикселов и быстродействием 1 млн. операций в секунду). Когда, исходя из этих требований, просчитали вариант реализации на машинах ЕС и СМ, оказалось, что понадобятся средства, вдвое превышающие основные фонды ЗИЛа.

https://www.osp.ru/cw/2000/24/5596/

Что характерно – многие в том же самом 1985 году и представить не могли, что такие “персоналки” кому-то понадобятся:

Потом где-то в середине восьмидесятых годов министр Минэлектронпрома В. Г. Колесников постановил, что нужно делать 32-разрядные процессоры, совместимые с процессорами DEC. Я, кстати, тогда был против этого, потому что считал, что будущее не за мэйнфреймами, а за персональными компьютерами. Но меня, естественно, никто особо не спрашивал. И тогда сделали 32-разрядный микропроцессорный набор (комплект микросхем), программно совместимый с ЭВМ VAX.

http://155la3.ru/datafiles/VAX_russia.pdf

Закон Мура и московская розница

Кстати, у меня среди прочей фигни обнаружились сканы прайс-листа одной из московских компьютерных фирм конца 1995 и начала 1996 года (кликабельно).

price1995

price1996

Pentium-100 за полгода подешевел с 299 $ до 210 $, а планка памяти на 8 Мб – с 254 $ до 138 $. Слабо найти так же быстро дешевеющую компьютерную комплектуху сейчас? Подождав в 1990-х шесть месяцев – вы получили бы заметное улучшение “железа”; подождав такой же срок в 2010-х – не получили бы практически ничего.

Кстати, про производительность ПК

Вот попался на глазазакон Кармака“:

Because of the nature of Moore’s law, anything that an extremely clever graphics programmer can do at one point can be replicated by a merely competent programmer some number of years later.

Сказано это было в 2004 году, 15 лет назад – а под “законом Мура” понималась, видимо, одна из его “популярных” формулировок – о том, что производительность персональных компьютеров удваивается каждые 18 месяцев. Вероятно, так оно и было до недавнего времени – но вот как-то я решил посмотреть на производительность “моих” ПК и заметил, что что-то случилось нехорошее.

Итак, первым моим компьютером в 1996 году был довольно крутой по тем временам Pentium с тактовой частотой 120 МГц, 16 Мб памяти и жестким диском на 800 Мб. За 7 лет он превратился в полный отстой – скажем, хит сезона 1999 года, Heroes of Might and Magic III, шел на нем с боооольшим трудом, а сосуществование рядом нескольких “жирных” игрушек и Microsoft Visual C++ 6.0 было довольно сложным. Его замена – Pentium IV 1600 МГц, 256 Мб памяти, GeForce 4 MX440 и жесткий диск на 60 Гб – прожила те же 7 лет и умерла от вспучивания конденсаторов. Я не помню, когда я поменял Windows XP на Windows 7 – но точно помню, что в следующей системе я просто вставил жесткий диск с операционкой от предыдущей машины и все благополучно запустилось. “Замена” – неплохой по меркам 2009 года Core 2 Duo с 2 Гб ОЗУ – работает до сих пор, пережив замену жесткого диска (поставлено что-то побольше) и видеокарты, правда, не как “основной” компьютер. Примерно в этот момент я сравнил свои ощущения от перехода на Pentium IV с ощущениями от перехода на Core 2 Duo – и почувствовал, что где-то наебка.

По тому самому закону Мура производительность ПК за 7 лет должна возрастать примерно в 25 раз – и в первом случае действительно вышло как-то так. Разница по всем параметрам была на порядок, ну а Windows XP после Windows 95 и вовсе радовала во всех отношениях. Во втором случае – ну да, памяти побольше, процессор пошустрее – но не на порядок, в повседневной работе вообще никакого качественного скачка не случилось.

А вот теперь – приготовьтесь к страшному. Когда семилетний десктоп окончательно перестал меня устраивать (по разным причинам) – я посмотрел предложение на рынке ноутбуков, посмотрел еще раз, и еще – и в итоге купил б/у Lenovo T420, 2012 года выпуска, с i5-2520M и 8 Гб ОЗУ. И знаете что? Сейчас, в 2019 году, я посмотрел, что предлагает Lenovo в T-series – и не скажу, что в сравнении с техникой семилетней давности вообще произошел какой-то качественный скачок. PassMark показывает разницу в производительности процессоров вдвое – и та достигнута в основном увеличением числа ядер, “однопоточная” производительность и вовсе очень близка. Память? Говорят, и в T420 можно напихать до 16 Гб. Скажу честно – я пользуюсь семилетним компьютером и не вижу причин бежать в магазин и покупать новый.

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

Говорят, что у вот этой остановки роста производительности ПК есть вполне себе фундаментальные причины – а это означает, что с надеждами на закон Мура стоит попрощаться, а “просто компетентный” программист уже не сможет заменить “очень умного”. Нет, и совет потратить 6 месяцев на игру на барабанах в рок-группе вместо оптимизации проекта тоже уже не работает. Придется как-то с этим жить.