К вопросу о легкости программирования

Вчера в комментариях два раза прозвучала точка зрения, совпадающая с популярным в среде программистов и сочувствующих заблуждением, что языки высокого уровня, типа VBScript, Java, C# или VB.NET — это идеальные языки для «не-программистов» — простые в освоении и «безопасные», то есть не дающие совершить ошибку. Но… Давайте вспомним задачу об определении резонансной частоты. Предлагается следующий код на VBScript (немного исправленный для большей реалистичности единиц измерения):

strL = InputBox("Enter the inductance, uH")
strC = InputBox("Enter the capacitance, pF")
WScript.Echo "Resonance frequency in kHz is " & ( 1.0 / Sqr( CDbl(strL) * CDbl(strC) ) )

Казалось бы, все очень просто. Но давайте сравним его с вот такой программой на QBasic:

DIM L AS DOUBLE, C AS DOUBLE
INPUT "Enter the inductance in uH and capacitance in pF", L, C
PRINT "Resonance frequency is "; 1.0/SQR(L * C); " kHz"

В чем разница? Программа на «классическом» Basic записывается с использованием простых операторов — здесь это DIM, INPUT и PRINT. Согласитесь, что PRINT — намного более очевидная запись для оператора вывода, чем «заклинание» WScript.Echo, а INPUT — более естественная форма записи оператора ввода, чем InputBox. Функция CDbl — это вообще «по ту сторону добра и зла».

Изложение основ Basic в объеме, достаточном для простых «вычислительных» программ, занимает всего лищь десяток страниц. Конечно, можно на том же десятке страниц рассказать и об аналогичных возможностях, к примеру, VBScript. В чем разница полученных знаний? Если изучающий «классический» Basic получит полное изложение основных возможностей языка, то его собрат по несчастью, вынужденный разбирать нюансы VBScript, будет воспринимать команды вроде WScript.Echo как «заклинания». Это еще не самое страшное. Если десятистраничное изложение основ VBScript — это начало книги по этому языку программирования, то, естественно, будет упомянут и «объект» WScript. Что такое «объект» — разъяснить человеку, не знакомому с программированием вообще, невозможно. Можно сколько угодно говорить, например, о прелестях использования библиотеки классов MFC, но если вы ни разу не писали с использованием «голого» WinAPI — вы никогда не поймете, что объектно-ориентированное программирование по своей сути — это удобный способ записи некоторых реально возникающих конструкций. Не увидев того, как эти конструкции возникают, невозможно представить себе, что такое «объект».

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

bool IsNumber (string str){return (str.Replace ("0", "").Replace ("1", "").Replace ("2", "").Replace ("3", "").Replace ("4", "").Replace ("5", "").Replace ("6", "").Replace ("7", "").Replace ("8", "").Replace ("9", "").Length == 0);}

В чем мораль? Не надо считать пользователя идиотом, подсовывая ему усложненный ради какой-то мифической «безопасности» язык. В том же «классическом» Basic были команды PEEK и POKE, осуществлявшие прямой доступ к памяти. Естественно, никто в здравом уме ими не пользовался, пока речь не заходила о каких-то специфических операциях, типа «взлома» ресурсов игр на том же Спектруме. Что же мы получили в разнообразных вариантах «визуального Бейсика»? По сути — ничего, кроме отказа от старых интуитивно понятных команд в угоду ООП. Вместе с заменой PRINT на «заклинания» вроде WScript.Echo, были выброшены, как устаревшие, многие полезные конструкции, работа с файлами и графикой превратилась в дикий кошмар.

Замечу, что один из лучших языков для «не-программистов» — встроенный язык Matlab — за все время своего существования не переиначивался в рамках модных тенденций. Я бы сказал, что для определенных задач он подходит намного лучше, чем Basic, и намного превосходит многие языки в простоте освоения.

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

К вопросу о легкости программирования: 3 комментария

  1. Всё правильно сказано.

    Заодно повторю здесь как будет выглядеть эта же программа на языке ПМК: x F√ F1/x С/П — четыре байта вместе с командой останова. Все команды, как в Спектруме, написаны на самих клавишах.

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

    Давайте теперь, для сравнения, попросим начинающего программиста написать несложную программу на любом современном «дружественном» языке, но без справочников, примеров и с отключением подсказок в среде разработки. Можно даже и не начинающего, но на малознакомом ему языке. :)

    1. Ну вы с Шурой даете. Взяли несуществующие преимущества ПМК и раздуваете их до неких исключительно удобных в использовании вычислителей. Не туда смотрите.
      Причина по, которой выпускают такие ПМК, как МК-152 — отнюдь не в удобстве для пользователя. Как раз удобством там уже не пахнет. Есть готовый дизайн операционный среды, огромное количество кода и приученные пользователи. Меня тоже в школе учили пользоваться логарифмической линейкой (1989 году!), но это не значит, что она лучше ПМК.

      К примеру, вы пишете о сложности современных языков программирования. Но ведь для сравнения с ПМК нужны только арифметические функции и три команды: цикл, условный и безусловный переход + команды или функции ввода/вывода. Сколько страниц будет занимать справка по этим командам для любого из популярных языков? С учетом отсутствия стека на изучение синтаксиса конкретного языка в таком объеме у взрослого человека с техническим образованием уйдет гораздо меньше часа.

      А удобство написания, отладки и хранения кода у современных мобильных ПК отличаются в разы. Это с учетом использования только бесплатных средств.

  2. Я написал так по привычке. Начинающий скорее всего напишет следующим образом, и оно тоже будет работать:

    L = InputBox(«Enter the inductance, uH»)
    C = InputBox(«Enter the capacitance, pF»)
    MsgBox «Resonance frequency is » & 1.0 / Sqr( L * C ) & » kHz»

    Input или InputBox по-моему пофигу. CDbl в данном случае не нужны (хотя без них будет намного менее очевидное сообщение об ошибке при вводе некорректных параметров, т.е. не-числа).

    Про десяток страниц — угадал, ровно 10 :-)
    http://msdn.microsoft.com/en-us/library/0ad0dkea(VS.85).aspx
    А про «будет упомянут и “объект” WScript» — не угадал, вообще ни один объект не упомянут.

    >подсовывая ему усложненный ради какой-то мифической “безопасности” язык
    Чем же он усложнён? Там даже от типизации переменных отказались.

    >визуального Бейсика
    VBScript не «визуальный бейсик».

    >один из лучших языков для “не-программистов” — встроенный язык Matlab — за все время своего существования не переиначивался в рамках модных тенденций.
    Приведу несколько цитат из хелпа матлаба 7.7:

    «Objects are well integrated into the MATLAB language, regardless of whether you are writing simple functions, working interactively in the command window, or creating large applications»

    «Events represent changes or actions that occur within class instances. For example,
    * Modification of class data
    * Execution of a method
    * Querying or setting a property value
    * Destruction of an object»

    «GUIDE, the MATLAB graphical user interface development environment, provides a set of tools for creating graphical user interfaces (GUIs).»

    «Using MATLAB as a COM client provides two techniques for developing programs in MATLAB:
    * You can include COM components in your MATLAB application (for example, a spreadsheet).
    * You can access existing applications that expose objects via Automation.»

    >для определенных задач он подходит намного лучше, чем Basic, и намного превосходит многие языки в простоте освоения.
    Согласен полностью.
    Ещё есть задачи (вроде твоего колебательного контура) когда MS Excel, который тоже намного превосходит многие языки в простоте освоения, подходит даже лучше, чем matlab или VBScript.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *