LINUX.ORG.RU

Почему во многих Питон-проектах не используют async/await и ООП, как в Java?

 , , ,


2

1

Привет, всем. По работе смотрю новые питоновские проекты, и немного удивляет следующие детали:

  1. по сей день, пытаются все оформить сугубо через def() и форкать разные Py-скрипты через систему

  2. не смотря на наличие async/await в Python v3 - не используют и не пытаются

  3. если и объявят class , то он сугубо используется для DAO/DTO, ни каких сложных ОО-дизайнов не оформляется… type hints не испольуются, ABC-контракты не используются, GoF-паттерны тоже

  4. прикрываются якобы композицией, и что вообще ОО-дизайн - мертвый дизайн (у Golang лагеря насмотрелись, что ли?)

Говорю не про публичные проекты, которые в GitHub можно найти. А про многие, которые делает разработка в рос. компаниях. Картину наблюдаю на разных компаниях в течении последних двух лет.

Вот, я не пойму… Я что-то не понимаю или что? Вроде, появляются различные интересные фичи в Python3 , ряд вещей позволяет приблизится к написанию кода, как на Java.

Все-таки, Python не является Haskell, OCaml или каким-нибудь диалектом LISP. Это язык с элементами функциональщины, а не pure functional language, как Haskell. Так от чего не снабдить свой код asyncio, все граммотно оформить по ОО-дизайну с SOLID-принципами, четко разработь с event loop и прочим… Все какая-то портянка из 100500 глобальных def’ов вижу, в основном, в проектах. Да и вроде… Компании - солидные и платят этим Питонисам 250+ рублей в месяц. А стиль написания такой, за который могли бы уволить джуна в 2010ом, если речь шла про другой стэк (C#, Java).

Вопрос: от чего же в новых питоновских проектах на живой практике многие разработчики не пытаются применить фичи из последней версии языка, и приблизиться к дизайну/стилю кода, как на Java. И вообще, все сделать по канону чистенько, соблюдая SOLID. При наличии уже таких возможностей.

Это лень и нежелание просто? Или есть объективные причины забить болт на все это, и далее оформлять спагетти-код километровый?

P.S. не удтверждаю, что я - прав. Возможно, я совсем не прав. Я просто реально не понимаю, почему качество Питон-проектов, как было примерно таким 10 лет назад, то таким и осталось… Адепты на других языках, как-то более лучше развиваются в плане чистоты своих проектов. Опять сугубо моё ИМХО.

Ответ на: комментарий от anonymous

судя по темам/каментам: написал явный школотон

Нет, я давно решил что незачем туда ходить.

ну, например, наколенный оконный менеджер на C - это ни разу не серьёзный проект

Я и не говорил что он серьёзный (что не отменяет чрезвычайной полезности). Но то, что он на Си - однозначно плюс.

небезопасный легаси макроассемблер

Это о чём вообще?

firkax ★★★★★
()
Ответ на: комментарий от firkax

Нет, я давно решил что незачем туда ходить.

«…Но мамка не разрешает».

Но то, что он на Си - однозначно плюс.

Чушь.

Это о чём вообще?

Си и Си++

anonymous
()
Ответ на: комментарий от tz4678

процедурные языки

ООП и функциональщина

а разве есть какая-то глобальная разница между процедурными и функциональными языками? вот у тебя функция/процедура, вот у тебя аргументы, вот она что-то вернула.

ООП это совершенно другой зверь, его популярность я могу объяснить только тем, что в C++ модули (инкапсуляция - это единственное, что можно полезного получили от ООП сишники) завозили 40 лет, да так нормально и не завезли, насколько я знаю. Java делали, чтобы быть знакомой плюсовиками, C# аналогично, так и живут c этим Trillion Dollar Disaster до сих пор

anonymous
()
Ответ на: комментарий от anonymous

Да, инкапсуляция и нэймспейс изолейшн. Без них тяжко. ООП не нужен.

anonymous
()
Ответ на: комментарий от tz4678

tz4678 ★★ (23.11.21 18:51:13)

на то что ты меня затроллил

Бро, это не конiц, поверь. Когда ты умрешь, я застрелю себя и буду тебе в аду про Java & GoF-паттерны продолжать толдонить.

twinpeaks
() автор топика
Ответ на: комментарий от anonymous

anonymous (23.11.21 21:07:00)

а разве есть какая-то глобальная разница между процедурными и функциональными языками? вот у тебя функция/процедура, вот у тебя аргументы, вот она что-то вернула.

Функциональное программирование фокусируется на expressions, а процедурное программирование фокусируется на statements.

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

И, в функциональных языках, как правило все построено на рекурсиях, любой чих. Есть требования по pure functions в плане возврата аргумента, т.е. построенно на математической композиции функций. Все операции должны быть stateless, т.е. функции не должны иметь side-эффектов. И т.д. и т.п.

twinpeaks
() автор топика
Последнее исправление: twinpeaks (всего исправлений: 2)
Ответ на: комментарий от anonymous

функциональщина - это хаскель, хотя можно и на js писать такой код:

Array.from({ length: 10 }, () => String.fromCharCode(Math.random() * 26 + 65)).join('')
'EVPALNQYMV'
tz4678 ★★
()
Ответ на: комментарий от tz4678

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

tz4678 ★★
()
Ответ на: комментарий от anonymous

«…Но мамка не разрешает».

Нет. Я и правда не хожу.

Чушь.

Сам ты чушь. Напиши свой лучше этого.

Си и Си++

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

firkax ★★★★★
()
Ответ на: комментарий от tz4678

tz4678 ★★ (23.11.21 21:29:11)

функциональщина - это хаскель, хотя можно и на js писать такой код:

Array.from({ length: 10 }, () => String.fromCharCode(Math.random() * 26 + 65)).join('')
'EVPALNQYMV'

Твой код на JS - настолько функциональный, что Таносу пришлось щёлкать дважды, чтобы он исчез.

twinpeaks
() автор топика
Ответ на: комментарий от twinpeaks

А как по-мне это красота:

((charSet, length) => Array.from({ length }, () => charSet.charAt(Math.random() * charSet.length)).join(''))('1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM', 40)
'2bbR08E3GWQOqUYdaPLPm0gGb19urXqKewVHxpVu'
tz4678 ★★
()
Ответ на: комментарий от anonymous

anonymous (23.11.21 20:34:28)

ну, например, наколенный оконный менеджер на C - это ни разу не серьёзный проект (да и C нормальным можно назвать с натяжкой: небезопасный легаси макроассемблер для PDP, который всё пытаются натянуть на современные многоядерные системы, шо ту сову на глобус)

А PostgreSQL/Greenplum, которые на Си - серьезные проекты? :)

twinpeaks
() автор топика
Ответ на: комментарий от tz4678

Попробуй на том же Haskell, будет лаконичнее и красивее.

twinpeaks
() автор топика
Ответ на: комментарий от anonymous

Неказистый, кривой, косой, непропорциональный.. Вдобавок, ужасно тупой._

но это декларативный язык в чистом виде без всякой императивщины… хотя не в чистом туда все-таки циклы с переменными и процедурами добавили

tz4678 ★★
()
Ответ на: комментарий от twinpeaks

Бро, это не конiц, поверь. Когда ты умрешь, я застрелю себя и буду тебе в аду про Java & GoF-паттерны продолжать толдонить.

Да вот именно, от всей этой тоски типа Java и GoF хочется застрелиться.

Как можно писать на Java, вообще не понимаю. Неимоверно занудный язык, типичное порождение корпорации: шаг влево, шаг вправо — расстрел. Корпоративный раб должен смирно сидеть в кубикле и писать десять SingletonAbstractFactoryOfFactories в день, чтобы возможно получить следующий грейд на годовом performance review.

Нет серебряной пули, нет серебряной пули. Об этом ещё старина Брукс написал.

Нет волшебной палочки типа: «Заверни весь свой код в синглетоны» и все проблемы сразу волшебным способом разрешатся. Пользователи начнут давать ясный однозначный фидбек, по внешним API появится вменяемая документация и они начнут отдавать вменяемые сообщениея об ошибках, программисты перестанут писать говнокод, к прекрасному коду на синглетонах автоматически возникнет прекрасная документация, и т.д. и т.п.

Более того: увы, большинство этих architecture astronauts то ли никогда не писали код, то ли делали это очень давно. В своих книгах они демонстрируют «преимущества» своих мега-паттернов/ООП/DDD/functional programming/прочие buzzwords на настолько тривиальных примерах, что их легко смог бы реализовать на COBOL выживший из ума пенсионер. Когда начинаешь прикладывать это к реальным жизненным задачам, оно всё время прикладывается как-то вкривь и вкось.

И от того, что каждый раз открывая Java код я вижу названия классов шире моего монитора (DatabaseRepositoryContainerUtilsDecoratorFacade), этот код не становится ни капли понятнее или лучше.

emorozov
()
Последнее исправление: emorozov (всего исправлений: 1)
Ответ на: комментарий от emorozov

по общему правилу паттерны нужно применять, когда не знаешь как что-то сделать… только вот скриптовые языки настолько гибкие, что ты можешь буквально левой пяткой правое ухо почесать, и вышеобозначенная проблема может и не возникнуть… и так то тебе ничего кроме consumer/producer и прочих адаптеров не пригодится, да и то ты не задумываешься, что это какой-то там паттерн, оно как-то само приходит, а при джава-подходе они сидят заучивают паттерны, эти диаграмки, что какой делает без которых и собеседование для трудоустройства не пройти, а начинающий пхпшник за время пока джавобой учит паттерны очередной битрикс выср… напишет

tz4678 ★★
()
Последнее исправление: tz4678 (всего исправлений: 2)
Ответ на: комментарий от emorozov

Да вы, питонисты, уже в доску охренели. Ну и говорю, все свелось у вас к тому, что:

ООП, SOLID, DDD - старье, enterprise, плохо и не нужно с ваших слов. А как вы, блэт, свои Питон-проекты структурируете, блэт?

emorozov (23.11.21 22:09:37)

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

Ни х%№ и луку мешок! Вот, заладил ты про «реальные задачи». Вполне реально. Читал IDDD Эванса (красная книжечка), и вполне себе там жизненные примеры, как оформлять слой бизнес-логики через призму bounded contexts, агрегатов, саг. И другую книжечку читал про модель акторов. И блэт, Akka построена на модели акторов. И все классно и структурировано.

Вы себе х%№"ю, питонисты сранные придумали, мол «паттерны непонятно для чего». Да, понятно для чего, блэт. С ними - чище и структурированее. Как раз, если у тебя все нормально оформлено, то программист который придет в проект - сможет его поддерживать, а ваши потрянки с 100500 def() х@# пойми, как поддерживать

emorozov (23.11.21 22:09:37)

Как можно писать на Java, вообще не понимаю.

Не понимаю, как можно спагетти в 100500 километров варить на Питоне без желания что-то структурировать нормально.

emorozov (23.11.21 22:09:37)

Нет серебряной пули, нет серебряной пули. Об этом ещё старина Брукс написал.

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

А вот, ваша шняга в def() на def() + 100500 ни один программист поддерживать не сможет, кроме авторов этой питонячей шняги.

twinpeaks
() автор топика
Последнее исправление: twinpeaks (всего исправлений: 6)
Ответ на: комментарий от twinpeaks

А вот, ваша шняга в def() на def() + 100500 ни один программист поддерживать не сможет, кроме авторов этой питонячей шняги.

Я сейчас поддерживаю шнягу на паттернах и DDD, которую ни один программист поддерживать не сможет. Из-за NDA не могу сказать, что это за шняга и показать примеры.

Суть в том, что дурак и с паттернами, и с DDD, останется дураком. А умный сможет 100500 def + def написать так, что это будет красиво, понятно, расширяемо, да ещё и быстро работать.

Да, понятно для чего, блэт. С ними - чище и структурированее.

Звучит как карго-культ, ей-богу. «Если мы все начнём до буквы поддерживать GoF, то на нас начнут сыпаться ништяки, как на белых людей». Нет.

emorozov
()
Ответ на: комментарий от tz4678

tz4678 ★★ (23.11.21 22:25:38)

а начинающий пхпшник за время пока джавобой учит паттерны очередной битрикс выср… напишет

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

Слава Богу, что ты самолеты не проектируешь, а то це катастрофа была бы где-нибудь с такими подходами.

P.S. случаем Sputnik V не колол себе?

twinpeaks
() автор топика
Ответ на: комментарий от twinpeaks

Функциональное программирование фокусируется на expressions, а процедурное программирование фокусируется на statements.

int inc (int x) {
   return 1 + x;
}

ну и чем оно отличается от

(define (inc x)
   (+ 1 x))

где изменение состояния ?

И, в функциональных языках, как правило все построено на рекурсиях, любой чих.

и тут такая кложура с recur вылезает и смеётся

В чисто процедурном языке наоборот все построено на состояниях машины, которыми он манипулирует.

ну так погоди, если меняется состояние - программировать, по идее, становится сложнее, потому что мало написать, так ещё надо проконтролировать, что ничего не крякнется

anonymous
()
Ответ на: комментарий от twinpeaks

Лучше уж пусть человек паттерны учит, потом нормальную вещь напишет.

нормальную? на паттернах? сомневаюсь

anonymous
()
Ответ на: комментарий от anonymous

С чего вы там взяли, что ООП это дизастер? Прекрасный инструмент моделирования окружающего мира. Есть класс, есть объект, есть надругательства над объектом. То, что в профессию лезут всякие гретытунберг от программирования со своими психическими расстройствами и уродуют все, до чего дотянутся, к самому ООП отношение имеет весьма и весьма отдаленное.

untitl3d
()
Ответ на: комментарий от twinpeaks

А PostgreSQL/Greenplum, которые на Си - серьезные проекты? :)

софт родом из 1987 с мейллистом вместо ишью-трекера? ну даж не знаааю….

anonymous
()
Ответ на: комментарий от untitl3d

Прекрасный инструмент моделирования окружающего мира.

это либо откровенная ложь либо лютая некомпетентность (в окружающем мире и в программировании)

в реальном мире нет ничего того, что нам предлагает ООП, как минимум в том виде, в котором оно это предлагает.

Смоделируй мне варку пива на ООП, например.

anonymous
()
Ответ на: комментарий от anonymous

уволены должны быть те, кто занимаются байтодрочем вместо того, чтобы решать задачи

anonymous
()
Ответ на: комментарий от anonymous

это либо откровенная ложь либо лютая некомпетентность (в окружающем мире и в программировании)

Насмешил так насмешил. Оно именно так как я сказал — ООП моделирует мир и ничего большего ООП из себя, как идея, не представляет.

Смоделируй мне варку пива на ООП, например.

Если ты сам до такого додуматься не можешь, то иди пей пиво дальше :)

untitl3d
()
Ответ на: комментарий от untitl3d

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

Кстати, UNIX в общем и язык Си в частности потому и обрели в свое время популярность у бородатых админов/программеров, что были KISS без гретытунберг во все поля (см. Java и GoF).

untitl3d
()
Ответ на: комментарий от anonymous

ящитаю это лучше, чем жрать то, что дают

Рад за вас. У меня такой приятель есть - тоже, примерно, так говорил (сишачка и прочее), кончилось тем, что он стал немного никому не нужен со своими знаниями в его возрасте, теперь работает за 30 копеек и часто меняет работу да и без работы не редко сидел - проектов маловато. Но жена у него более мудрый человек и не брезгливая, так что на её шее фактически и сидит. Если у тебя мудрая жена с норм. зп ? :-))))

vtVitus ★★★★★
()
Последнее исправление: vtVitus (всего исправлений: 2)
Ответ на: комментарий от twinpeaks

чтобы другой погроммист мог поддерживать проект

Короткие проекты, написанные в pythonic-стиле, очевидны и поддерживабельные любыми программерами.

Юзать паттерны из java только ради того, чтобы большие проекты на питоне были мейнтебельны — такое себе. Просто потому, что большие проекты на питоне — боль. В любом стиле. Независимо от SOLID, ООП, async, типизации, паттернов и всего прочего. Да, структурирование поможет. Но оно всё равно будет хуже, чем сделать то же самое на том же шарпе.

В той же джанге порядка 80k sloc без тестов и это уже слишком много для питонопроекта. И это при том, что код джанги вполне неплохой для проекта такого возраста.

x3al ★★★★★
()
Ответ на: комментарий от untitl3d

Кстати, UNIX в общем и язык Си в частности потому и обрели в свое время популярность у бородатых админов/программеров, что были KISS без гретытунберг во все поля (см. Java и GoF).

Чего может быть киссового в C и C++ кроме реализации самого языка? Примитивность и простота это немного разные вещи.

anonymous
()
Ответ на: комментарий от tz4678

причем эти 50.000 строк были в одном файле… такое се заявление, короч

tz4678 ★★
()
Ответ на: комментарий от anonymous

Про C++ речи не было. Было про юниксы и си. У юниксов очень простые внутренности (см ядро опенбзд), чего про линукс уже к сожалению не скажешь. А си простой, но мощный инструмент который, что очень важно, не навязывает вообще никаких паттернов поведения, как хочешь так и пиши. Обычно получается красиво. Тут цитата про опасную бритву и кровавую баню :)

untitl3d
()
Ответ на: комментарий от anonymous

Критерии лучшести, пожалуйста. Или субъективщина.

Скорость работы (запуск и латенси), отсутствие багов, количество зависимостей, размер исходника и бинарника. Остальное и правда субъективно, но можешь что-нить добавить. По последнему пункту (размер) допускаю что на питоне получится лучше, но он один такой.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от x3al

x3al ★★★★★ (23.11.21 23:38:01)

Юзать паттерны из java только ради того

Они, блэт, не из Java! Они - general purpose для семейства языков, которые ОО-парадигму поддерживают. И вообще, они (паттерны) из SmallTalk больше родились. Уже потом стали их применять к C#, Java и др., да и авторы сего подчеркивают сами, что high-level язык в целом не очень важен.

twinpeaks
() автор топика
Ответ на: комментарий от anonymous

anonymous (23.11.21 22:59:55)

ну и чем оно отличается от… где изменение состояния ?

Оно будет отличаться не на уровне кода, а на уровне как это будет разобрано в AST-дерево, и как будет исполняться в конечном итоге. Если же ты хочешь сайд-эффект получить, то сделай что-то типа такого на чистом СИ:

int i = 0;

int foo() {
  return i++;
}

У тебя результат будет отличаться из-за инкремента. В pure functional lang, как Haskell - не будет такого, ибо в чисто-функциональном lang побочные эффекты вроде i++ запрещены по дизайну. Таким образом, вывод функции должен зависеть только от значения ее аргументов. Например, если в Haskell есть функция foo с типом Int -> Int, то можно быть уверенным, что «foo 3» всегда будет возвращать одно и то же целое число при каждом вызове.

anonymous (23.11.21 22:59:55)

и тут такая кложура с recur вылезает и смеётся

Не знаю, что в Clojure. Я лично только с Haskell возился более-менее. Был у меня период, когда два месяца на нем писал.

anonymous (23.11.21 22:59:55)

ну так погоди, если меняется состояние - программировать, по идее, становится сложнее, потому что мало написать, так ещё надо проконтролировать, что ничего не крякнется

Да, надо контроллировать. Но, не стал бы употреблять слово «сложнее», скорее «геморойнее». Концепции в Haskell с монадами - вот это сложнее. Или, как правильно с многопоточностью работать. А понимать, что необходимо контроллировать state - это не сложнее.

twinpeaks
() автор топика
Последнее исправление: twinpeaks (всего исправлений: 2)
Ответ на: комментарий от anonymous

anonymous (23.11.21 23:06:47)

софт родом из 1987 с мейллистом вместо ишью-трекера? ну даж не знаааю…

Ну да :) Всего лишь, Постгря последняя уже дает просраться малость MSSQL & Oracle на 2021-ый год, как OLTP решение.

Строят на ее базе OLAP-решение в виде Greenplum, который тоже дает просраться всяким Vertica. Яндекс начинает интегрировать свой ClickHouse в комбо с Greenplum. Появляются хорошие программы сертификации у PostgresPRO и Arenadata. На иностранном рынке появляются всякие TimeScaleDB, которые добавляют в Постгри возможность time-series data, что можно хоть юзать в качестве backend для Prometheus (привет продукт Promscale). Citus, тоже, пилит свои интересные проекты на базе Постгри. Так… «фигня» какая-то… :)

twinpeaks
() автор топика
Последнее исправление: twinpeaks (всего исправлений: 1)
Ответ на: комментарий от untitl3d

untitl3d (24.11.21 00:18:05)

А си простой, но мощный инструмент который, что очень важно, не навязывает вообще никаких паттернов поведения, как хочешь так и пиши.

А на нем и не надо юзать паттерны. Зачем системному языку, на котором пишут:

  • Linux kernel
  • PostgreSQL
  • и др.

Который имеет ручное управление памятью - паттерны проектирования, которые больше ориентированы на написание бизнес-логики? Ес-но, именно на Си - не нужны GoF-паттерны. У него банально - другая область. На нам OS kernel пишут или high load вещи. В контексте GoF/DDD, они не нужны Си, как Си - не нужны они. Это не язык для прикладных задач. А вот, Java и Python - вполне себе прикладные языки.

twinpeaks
() автор топика
  1. по сей день, пытаются все оформить сугубо через def() и форкать разные Py-скрипты через систему

А в каких случаях такой способ плох?

не смотря на наличие async/await в Python v3 - не используют и не пытаются

Если проект сделан на синхронном фреймворке, асинхронный код засунуть туда очень трудно.

Технология сама по себе штука довольно консервативная, много кода сделано на 2.7, переход довольно затруднителен.

dicos ★★
()

ааа!!!

ууууууууу!!!!

оооооооооооооооооооо!!!!

Если кто понимает о чем пост …

anonymous
()
Ответ на: комментарий от untitl3d

не навязывает вообще никаких паттернов поведения, как хочешь так и пиши

Строгая императивщина. Фунциональный Си – это JavaScript. Я не представляю как сделать что-то функциональное на Си. Да и объектное тоже. Изоляция пространства имён в Си выглядит как – добавить префикс. Причём с ограничением в 31 символ для ELF (чего достаточно, но при кодогенерации – нет).

А си простой

Пара макросов ставят крест на любой простоте. Обработка ошибок методом не просто «напечатал ошибку и вышел» уже не тривиально. Ну и так далее. Это простота условна. А примитивность объективна.

anonymous
()
Ответ на: комментарий от untitl3d

язык Си в частности потому и обрели в свое время популярность

Там совсем другие загоны были. Даже надо сказать, противоположные: выбросить спецсинтаксис и сахарок, а вместо этого взять минимальный синтаксис и если что-то надо, то писать явно руками (те же паттерны, вид сбоку). Так что Си это контрпример как бы.

no-such-file ★★★★★
()
Ответ на: комментарий от twinpeaks

Почему-то до появления явы и питона и даже ц++, все прикладные вещи писались на си и все были довольны и никто не кукарекал, а про гретытунберг от программирования никто не знал. Повылезали потом сказочники продавать свои кривые костыли. Ты в курсе хоть почему ява набрала популярность? Да потому что санки ее продавали всеми правдами и неправдами и таки продали. Там нв рекламную кампанию ушло денег больше чем у гугола щас есть. Кто и как пиарил си, на котором все досихпор держится?

Ты, кажись, жертва пропаганды прошлой зимы. Цирк уже уехал, оглянись.

untitl3d
()
Последнее исправление: untitl3d (всего исправлений: 1)
Ответ на: комментарий от anonymous

А вот не надо надмозгов звать код писать. Ява прекрасный язык, его проблема именно в надмозглых синьорах, гофах и прочего хлама. С си таже история. На нем можно писать очень красиво, а можно нечитабельными недебажныии макросами.

untitl3d
()
Ответ на: комментарий от untitl3d

все были довольны и никто не кукарекал

А ты наверное не читал дядю Страуcтрупа, как они AT&T Bell Labs делали проект на С и жидко обосрались? В Bell Labs и обосрались, прикинь.

Djanik
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.