Задать вопрос
  • Возможно ли написание дипломной работы в Markdown?

    @justaguest
    ⁺¹, LaTeX великолепен. К сожалению мои преподы оказались мудаки, и я со всеми перессорился по поводу PDF vs DOC. Я так счастлив, что учусь на заочке — потому что по моему краткому опыту общения с работниками институтов, это просто бюрократы, не имеющие никакого отношения к науке, и похоже сидящие там по чистой случайности.
  • Какие методы Вы используете, чтобы быстро найти участок в проекте с сотней тысяч строк?

    @justaguest
    Да, «статичность» = «отсутствие побочных эффектов» — это я именно про C#, конечно же.
  • Какие методы Вы используете, чтобы быстро найти участок в проекте с сотней тысяч строк?

    @justaguest
    Ого-у… о.О Еще один баг — я перезагрузил страницу, и параграф исчез…

    Там был последний параграф, что некоторые считают, что изучение Хаскелл и Питон ухудшает программиста, и ссылка на lukeplant.me.uk/blog/posts/why-learning-haskell-py...
  • Какие методы Вы используете, чтобы быстро найти участок в проекте с сотней тысяч строк?

    @justaguest
    Упс, баг на тостере — там в ссылке продолжение текста. Там был смайл, намек на то, что статья по ссылке саркастическая.
  • Какие методы Вы используете, чтобы быстро найти участок в проекте с сотней тысяч строк?

    @justaguest
    Анатолий Медведев: из первого параграфа я так и не понял — было это возражение, или согласие с чем-то? Конкатенация — метод класса… Хорошо. Но это же не мешает им пользоваться на разных методах абстракции? А второе предложение относится к первому? То есть все таки нельзя?
    У меня имеется подозрение, что мы немного разошлись в беседе.

    Кстати в C# даже Main принадлежит классу ☺ Прошу прощения, я вот после того, как написал прошлый комментарий, подумал, что его можно неправильно понять, потому я допишу тут немного пояснений — когда я говорил об отсутствии разницы, я думал о сравнении статического метода класса с обычным «безклассовым» методом. Разумеется, если говорить о нестатическом методе класса, то разница большая, но я не это имел ввиду.

    По последнему параграфу, я думаю, стоит рассказать одну вещь. Она имеет косвенное отношение к теме, но мне кажется, ее стоит упомянуть. Когда я впервые познакомился с языком C#, у меня почти не было опыта, и я написал некое приложение — и качество там было, откровенно хреновым. Наверное несправедливо будет возлагать вину только на мою неопытность — не раз приходилось делать кривые решения и по вине кривого дизайна API в .net, и порой библейской документации на MSDN.

    Как бы то ни было, я совершил при разработке одну ошибку, которая абсолютно не очевидна, пока кто-то носом в нее не ткнет. Эта ошибка называется «побочные эффекты».

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

    Значительно позже я познакомился с ФП, и меня настигло просветление. Все переменные, которые использует функция должны передаваться в аргументах. Если существует что-то в объекте класса, что функция использует, оно в идеале должно быть константой, и никогда не изменяться на протяжении жизни объекта. И, если функция не полагается ни на какие переменные в объекте, ее лучше всего сделать статической — хуже не будет, зато сразу очевидно отсутствие побочных эффектов.

    Вообще ФП — по-крайней мере Хаскелл — настоящая кладезь идей. Существует даже шутка «Haskell is the best Imperative language», не без доли правды в ней. Правда писать код с непривычки сложно, надо очень серьезно поменять мышление, но есть одна особенность — если ты написал приложение, и оно скомпилировалось, значит почти наверняка будет работать (не исключены логические ошибки, но значительная часть проблем императивного кода в функциональном просто отсутствует). Но самое главное — эти идеи, они абстрактны, и не относятся к конкретному языку, их можно применять в любой парадигме! Я за время работы успел слишком много времени потратить на отладку чего-то, мистическим образом работающего неправильно, и идея заставить компилятор проверять как можно больше кода вместо меня, мне очень по душе.

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

    @justaguest
    Анатолий Медведев: нет, ну исходя из моих слов, что я не знаю, как может повлиять на предмет обсуждения конкретная парадигма, вполне можно спуститься к конкретным примерам ☺

    Одна и та же функция может использоваться на разных слоях абстракции, когда все сделано правильно — к примеру конкатенация строк. Плюс разного рода абстрактные функции; предполагаю, что количество таких функций может варьироваться в зависимости от языка — например в Хаскелл к этому набору можно добавить функторы и монады.

    Второе замечание: разницы между «свободной» функцией и методом класса особой нет, потому что, например, в языке C# функции не-члены не могут быть созданы в принципе; там это прекрасно обходится статическими методами — которые, думаю, можно семантически приравнять к обычным функциям. Кто-то мог бы аргументировать, что это лучше, т.к. позволяет видеть, из какого класса функция вызывается — на случай существования одноименных функций. Но этот случай должен прекрасно решаться аргументами различных типов — если же не решается, значит функции все же делают нечто различное, и должны быть названы так же по-разному (кстати, в свете такой ситуации обычные функции даже лучше ☺).

    Ну, и, последнее — я приводил выше пример, возникший у меня во время написания курсовой, и являющийся наглядным примером вопроса от ТС; и с тем, что функция используется во многих файлах он никак не связан — да я вообще понятия не имею, не то, что где она используется, а как она даже называется.
  • Какие методы Вы используете, чтобы быстро найти участок в проекте с сотней тысяч строк?

    @justaguest
    Анатолий Медведев: мы говорим абстрактно — я не вижу способов, как на обсуждаемый вопрос может повлиять парадигма.

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

    Фраза «ФП подразумевает говнокод в плане архитектуры сколько-нибудь большого приложения априори» являет собой чудовищное заблуждение. Скорее всего, ты путаешь функциональную парадигму с процедурной, это разные вещи.
  • Какие методы Вы используете, чтобы быстро найти участок в проекте с сотней тысяч строк?

    @justaguest
    Анатолий Медведев: так ведь ясен же контент каждого из этих файлов — но это не приближает к пониманию, где находится та функция. Если критиковать, то критиковать с аргументами: я привел названия файлов, и на мой взгляд они достаточно полно описывают свой функционал. Ты бы мог их назвать еще лучше?
  • Какие методы Вы используете, чтобы быстро найти участок в проекте с сотней тысяч строк?

    @justaguest
    Urukhayy: это был очевидный сарказм на основании бессмысленности этого ответа☺ Вот вы знаете, что такое «Ctrl+f»? В Vim это перемотка экрана. Даже, если предположить, что «Ctrl+f» стоит за «Ctrl + Find» — все равно остается куча вопросов: что ищет, где ищет, как ищет, с регулярками, или без… Черт, да это один из самых бессмысленных ответов!
  • Какие методы Вы используете, чтобы быстро найти участок в проекте с сотней тысяч строк?

    @justaguest
    Анатолий Медведев: да черт с ним, с языком — я привел примеры по именам файлов, ведь суть же спора: если не знаешь, в каком файле находится, следовательно плохая архитектура? Вот я и расписал имена файлов, что бы показать, что их нельзя было назвать лучше, но очевиднее от этого ничего не становится. Можно представить, что там находится код на С++, это сути в данном случае не изменит.
  • Какие методы Вы используете, чтобы быстро найти участок в проекте с сотней тысяч строк?

    @justaguest
    Анатолий Медведев: ну, вот возьмем например функцию sendmsg(). Скажу сразу, она лежит в файле linux/net/socket.c. Но опять же, там около пятидесяти директорий — большинство из которых относятся к вендорам, но можно увидеть и более абстрактные, как «unix», «ipv4», «ipv6» — с первого взгляда не становится очевидно, куда смотреть.
    Насчет С я тоже не соглашусь. Нет, я тоже не понимаю, почему нельзя писать на С++ — но нельзя определять плохую архитектуру по языку. Я предлагаю сразу тогда определять плохой архитектурой все, что написано не на Common Lisp — а что, отличный критерий, вон чуваки конкурентную войну в лохматых годах выиграли, пока Yahoo не продались.
  • Какие методы Вы используете, чтобы быстро найти участок в проекте с сотней тысяч строк?

    @justaguest
    Анатолий Медведев: ну да, само использование там в файле «StateUtils.hs» вдалеке от ГУЙ, вот только он там вызывает еще одну функцию, которая другую… Но суть не в том — я просто показал конкретный пример, когда местонахождение функции не очевидно, а я бы отнюдь не назвал архитектуру плохой, да и проект не особо велик.
  • Какие методы Вы используете, чтобы быстро найти участок в проекте с сотней тысяч строк?

    @justaguest
    Анатолий Медведев: да в том то и дела, что читаемость кода отнюдь не означает, что местонахождение той или иной функции будет очевидно. Оно очевидно, пока проект не стал большим. Вот захожу я, например, в директорию UI редактора YI(кстати у него как раз кода немного), и спрашиваю себя, где находится функция, которая помещает надпись текущего включенного режима на нижнюю часть графического интерфейса. Здесь есть файл «Pango.hs» — судя по названию, там какая-то базовая инициализация, и обертки над базовыми функциями, типа «создать текстовый виджет», наша функция может находится там. Еще здесь есть файл «SimpleLayout.hs» — нетрудно догадаться, что там расположение виджетов по-умолчанию, потому что нигде нет xml-файла «.glade», т.е. все описано в коде. Может наша функция там быть? Да! Потому что, если виджет с текстом текущего режима создается тут, то именно отсюда должна экспортироваться функция, дающая возможность что-то поменять. Есть еще некий «Utils.hs» — вероятно какие-то вспомогательные абстрактные от интерфейса функции — может наша функция быть там? Почему бы и нет: редактор поддерживает два интерфейса, в обоих установка текста с режимом — необходимый функционал, следовательно там может находится наша функция, работающая независимо от интерфейса. Тут есть еще файлы, но я и так много написал, потому просто скажу, что, наверное, можно найти и к ним причины, почему функция должна быть именно там. И, под конец главный вопрос: можно ли назвать эту архитектуру плохой? Да ни в коем случае, я не могу себе представить, как можно дать файлам исходного кода еще более говорящие имена, чем они есть сейчас! Но это не лишает нас необходимости искать функцию по файлам.
  • Какие методы Вы используете, чтобы быстро найти участок в проекте с сотней тысяч строк?

    @justaguest
    При правке чужого большого проекта это нормальная ситуация; оставил ниже пример подобной. Если под правильной архитектурой здесь подразумевается компилируемая документация на каждый существующий кусок кода — я склонен разочаровать, в большинстве проектов настолько вездесущей документации нет.
  • Какие методы Вы используете, чтобы быстро найти участок в проекте с сотней тысяч строк?

    @justaguest
    При большой правильной архитектуре ответ может с равной вероятностью лежать в любом из десятка файлов в директории, к которой получилось свести местоположение. Чтобы далеко не ходить за примерами — ядро Линукс, его трудно обвинить в неправильной архитектуре. И я только что подсчитал: в Linux-4.0.5 3159 директорий, и 48948 файлов.
  • Возможно ли скомпилировать openssh-server из системы Ubuntu под систему Android?

    @justaguest
    >1.0 Возможно ли скомпилировать openssh-server из системы Ubuntu под систему Android?
    Ответ же очевиден: разумеется невозможно, компиляция производится на других 500Мгц Android планшетах, из которых строят сетевой кластер формы «звезда», и поют над ними сатанинские песни, ибо производительность до десктопа все равно не дотягивает, и IT'шникам надо время компиляции себя развлекать. Либо используют для этого Windows® с Cygwin, постоянно мучаясь, когда очередная утилита работает не совсем так, как предполагалось из-за каких-нибудь переменных окружения, либо потому что «ln» оттуда не создает символические ссылки, либо еще по каким-нибудь причинам.
  • Почему у ноутбука тихий звук?

    @justaguest
    У меня когда-то на старом ноутбуке было что-то похожее под WinXP, я тогда подозревал в этом Винамп, уже не помню, почему. Что интересно — звук восстанавливался после того, как я все переустанавливал, а делал я это раз в полгода, в силу моей любознательности и кривых тогда рук. Под Win решения так и не нашел, но, наверное, в основном потому, что я ушел на Кубунту — там ни малейших проблем со звуком не наблюдалось.
  • Почему домен "ua" такой дорогой?

    @justaguest
    Ответ вместо комментария?
  • Ubuntu 12.04. Учусь программированию. На чем писать программы в этой системе?

    @justaguest
    Я бы и по vim кучу всего написал -- просто сейчас уже помню проблемы весьма абстрактно. Но, было что-то похожее.