Задать вопрос
  • С чего начать изучение написания TDD - тестов?

    @abcd0x00
    TDD на первый взгляд выглядит хорошо, но потом начинается свистопляска.

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

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

    Это выглядит так:
    Однажды ты хочешь написать классную программу, которая делает это, это и это. Ты, находясь под впечатлением от её возможностей (в воображении), продумываешь все её компомненты в голове до мельчайших подробностей и готов броситься в бой. Уже видишь эти данные, полученные из неё в результате, и уже лазишь по ним, применяя там-то и там-то.

    Но надо соблюсти правила TDD и ты утопаешь в этих покрытиях каждой шпуньки тестами со всех сторон. В результате, у тебя множество тестов, длинная история в репозитории из их создания и ноль программы.
    А ведь нужна именно программа, а не тесты к ней.

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

    Но это ещё не всё. Однажды наступает момент, когда программу надо не отрефакторить, а кардинально изменить. (А это самое важное - вовремя убрать какой-нибудь тупик, к которому всё идёт. Если этого не делать, программа будет представлять из себя конгломерат из затычек - и пример уже есть, десятой версии.) И становится просто жалко стирать тесты, которые к новой версии вообще не подходят.
    Ответ написан
  • Выбор личного ToDo-менеджера?

    @abcd0x00
    Emacs + org-mode
    orgmode.org

    Презентация
    www.youtube.com/watch?v=6W82EdwQhxU
    Ответ написан
    Комментировать
  • Какая разница между C, C#, C++?

    @abcd0x00
    Какая разница между этими языками ?

    Язык C - это язык, которому 40 лет, на нём очень много программ написано, поэтому сталкиваться с ним в мире компьютеров ты будешь постоянно.

    Язык C++ - это язык, созданный лишь с одной целью, - прославить своего автора так же, как C прославил своего. Поэтому он всё время противопоставляется C, при этом явно до него не дотягивая.
    Тут тебе и каша-малаша в приоритетах операций, и запутанный синтаксис (иногда чрезмерно удлинённый или в стиле масла масляного), множество введённых ключевых слов, убивающих любой язык, и вечная недоделанность встроенных типов данных (стек или очередь, которые обязательно надо дописывать, прежде чем пользоваться).
    Но ему тоже много лет (лет на 15 он младше C), да и производительность сохранилась на сишном уровне, поэтому кода тоже много и есть многие вещи, которых нет для C.

    Язык C# - это язык, созданный лишь с двумя целями, - выпнуть Java с рынка и максимально пришпилить программистов к Windows, чтобы они никуда не могли с неё уйти и были вынуждены ставить сегодняшние индусские обновления для десятки.
    Сам язык хороший, в нём всё есть, но его политическая направленность заставляет софт работать для Microsoft, а они обычно бесплатно ничего не делают и целенаправленно создают проблемы из воздуха.

    Резюмируя вышесказанное, хорошо спроектированные языки - это C и C#, но C - минималистичный и удобный для подготовки к ассемблеру (а это тоже придётся узнать с вероятностью 100%), а C# - полон всех новшеств, но подходит для перехода на другой хороший язык.

    А программировать надо в Linux, там всё для этого есть.
    Ответ написан
    4 комментария
  • Что то с моей головой или с ssh?

    @abcd0x00
    Как-то тоже мучался очень долго с ssh, всё переделывал с начала раз сто.
    Оказалось, что проблема в правах на директорию .ssh. Причём это вещь не простая, а регулируемая новыми настройками, поэтому в старой документации может и не встречаться необходимость их соблюдения.

    man sshd_config
    StrictModes
                 Specifies whether sshd(8) should check file modes and ownership
                 of the user's files and home directory before accepting login.
                 This is normally desirable because novices sometimes accidentally
                 leave their directory or files world-writable.  The default is
                 “yes”.  Note that this does not apply to ChrootDirectory, whose
                 permissions and ownership are checked unconditionally.


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

    Запусти сервер (sshd) с ключом -d (повторяя до трёх раз), и он будет выдавать инфу, куда доходит клиент.
    Ответ написан
    4 комментария
  • Как лучше: разбивать рабочий день на две части или работать залпом, а потом отдыхать?

    @abcd0x00
    3) Может кто свой вариант посоветует?


    Я понял, что нужно работать по часу-полтора, а отдыхать не более десяти минут.
    Как в вузах сделано: четыре пары с короткими переменами.
    Это же тоже не с потолка взято, а оптимально подобрано педагогами для работы мозга.
    Ответ написан
    2 комментария
  • Как вы живете с большим количеством открытых вкладок браузера?

    @abcd0x00
    Если вкладок много, раскидываю их по разным окнам браузера (drag & drop).
    Если выхожу, запускаю скрипт, сохраняющий ссылки с заголовками в текстовый файл.
    А потом эти ссылки уже открываю через C-c C-o, прицепленное через init-key-bindings.el
    (global-set-key (kbd "C-c C-o") 'browse-url-at-point)


    :))
    Ответ написан
    Комментировать
  • Чем плохи комментарии на русском языке в коде?

    @abcd0x00
    Я сам не знал, пока не столкнулся с большой программой, где комменты были на испанском. Считай, что комментариев там просто нет.
    Ответ написан
  • Есть ли какая-нибудь классическая литература про работу с памятью, на примере языка Си или С++?

    @abcd0x00
    K&R2
    https://en.wikipedia.org/wiki/The_C_Programming_La...

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

    Память представлена связным списком блоков, от которых нарезаются кусочки при выделении и которые склеиваются в большие блоки при высвобождении. (Есть и другие менеджеры памяти типа питоновского.)
    Ответ написан
    Комментировать
  • Как правильно начать работу с git?

    @abcd0x00
    Нужно сделать один голый репозиторий, разместить его в доступном месте (с открытым ssh), а потом склонировать его (по ssh) в тех местах, где он будет использоваться.
    Потренируйся на тестовом репозитории, в котором один файл.
    Ответ написан
    2 комментария
  • Bash: возможна ли такая манипуляция в одну команду?

    @abcd0x00
    cat /etc/passwd | tee x - -
    Ответ написан
    Комментировать
  • Где найти эти Ваши "основы программирования"?

    @abcd0x00
    Так же я не знаю какой язык изучать.

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

    Я хочу писать свои личные приложения для своего андроидофона, я хочу писать свои личные десктоп программки, я хочу оптимизировать свою работу при помощи скриптов

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

    Как происходит изучение программирования:
    1) Сначала ты просто приобщаешься. Покупаешь книжку какую-нибудь по языку и проходишь все примеры в ней. Так ты узнаёшь, как выглядит хороший код. (Чтобы потом отличать лажовые материалы от нормальных.)
    2) Потом ты изучаешь разные классические алгоритмы. Так ты узнаёшь, что существует что-то общее в устройстве разных алгоритмов.
    3) Потом ты находишь теорию алгоритмов. Так ты узнаёшь, что программа - это просто реализованный алгоритм. (Программу можно встраивать в программу.)
    4) Потом ты читаешь другие программы, выделяя их алгоритмы. Так ты перенимаешь распространённые способы построения алгоритмов.
    И вот после всего этого у тебя есть представление, как сделать большую программу.
    Большая программа - это объединение маленьких программ.
    Ответ написан
    Комментировать
  • Что происходит с этим кодом?

    @abcd0x00
    int n = *w++;

    *w++ работает так же, как *(w++) .
    Сначала происходит инкремент указателя, операция пост-инкремента возвращает значение операнда до инкремента, а затем это значение разыменовывается и результат присваивается переменной n.
    После этого в n находится 5, а указатель w указывает за край массива.
    Ответ написан
    Комментировать
  • Работа без высшего образования, это реально?

    @abcd0x00
    Важно проучиться в вузе, чтобы понять, что это такое. После вуза как бы мир делится на людей с в/о и без в/о - это просто видно. Там ещё преподают всякие мифологии и культурологии, в которых сам никогда развиваться не будешь. Это в плане "для жизни".

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

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

    @abcd0x00
    Использую git по принципу master/devel. В master идут только крупные изменения вроде новых версий, которые помечаются тегами. В devel идут только принимаемые изменения (никаких ошибок). Для каждого нового процесса создаётся ветвь, которая вливается в devel, когда полностью завершена. А вот ветвь процесса может быть одна или ветвиться дальше.

    Зачем это нужно? Проектов много, каждому по несколько лет уже. Когда через год открываешь что-то, то не очень помнишь, какие там были нюансы, задумки. У меня бывало уже такое, что я открывал собственный код и никак не мог даже вспомнить, когда это я его писал.
    Ответ написан
    1 комментарий
  • Из математика в front-end разработчика. С чего начать?

    @abcd0x00
    Поэтому где-то полгода назад пришла в голову мысль, что нужно что-то в жизни менять и начинать переориентироваться, а web-разработка была интересна всегда.

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

    Самому понадобилась матёма, когда делал реализацию aes128 (умножение многочленов над полем Галуа) и при изучение метода индуктивного вычисления функции на пространстве последовательностей (изоморфные отображения классов эквивалентности).

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

    И вообще, какой минимальный набор нужно иметь в запасе, чтобы получить начальную работу в этой сфере?

    Не ориентируйся на работу, таких работников (и даже лучших в разы) - вагон и маленькая тележка.
    Ответ написан
    Комментировать
  • Как сделать переопределение функции "".format() на Python?

    @abcd0x00
    Вообще, метод формат обращается к магическим методам объектов, которые и определяют поведение
    >>> (1).__format__
    <built-in method __format__ of int object at 0x4cba34a0>
    >>>


    Пример, как можно вводить свои спецификаторы
    >>> class Int(int):
    ...     def __format__(self, spec):
    ...         if spec.startswith('x'):
    ...             return str(self) * int(spec[1:])
    ...         return super().__format__(spec)
    ... 
    >>> n = Int(10)
    >>> '{:05d} {:x5}'.format(n, n)
    '00010 1010101010'
    >>>
    Ответ написан
    1 комментарий
  • Как начать работать удаленно или фрилансить, если даже проекты по мизерной цене вызывают затруднения?

    @abcd0x00
    Когда я пришёл на odesk.com, мне казалось, что там легко заработать. Но потом оказалось, что там надо заниматься менеджментом, всякими общениями, убеждениями.

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

    Где-то на середине заказчик пропал, но я решил это дело доделать, причём на совесть (с юнит-тестами, sqlite'ом - со всей хренью в общем).
    Когда я сделал это всё, я понял, что я ничего не смыслю в реальной работе.
    Сайт оказался сломанным - многие теги, которые должны иметь закрывающие, их не имели. Там даже страницы без закрывающего < /html> были. Он был сломан не только в плане HTML, но ещё и в плане навигации - циклились ссылки.

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

    Из-за этого я больше там не ищу заказы, так как просто не потяну, а уронить звёздочки из-за такой мелочи не хотелось бы.
    Ответ написан
    4 комментария