Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 5
×
программист
  • Почему ваш стартап (не) получит денег

    и еще, если ваша цель заработать миллионы или «мировое гостподство»™, то, конечно, нужно понимать, что само собой это с неба не свалиться — могут понадобиться и сверхчеловеческие усилия;). Понятно, что венчурам нужны именно такие люди, готовые пожертвовать всем ради «зелотого теленка». Но это не единственная возможная цель при создании стартапа, правда ведь?...

  • Почему ваш стартап (не) получит денег

    одинаковый, если вы, конечно, не считаете, что все работники должны зарабатывать как Ларри и Сергей.;)

  • Почему ваш стартап (не) получит денег

    2 eugene_nВы хорошо сказали.Но вот, кстати, под ваше определение не попадет стартап автора (maanimo.com). Это я к тому, что таких стартапов (в узком смысле), которые создают рынок, единицы: Apple, Google (в смысле рынка контекстной рекламы, а не поиска, конечно), Ford Motor, Gillette, кто там еще?;) Последний хороший пример, это, пожалуй OLPC, по сути создавший рынок нетбуков. При этом никто миллион не заработал, кажется...Автор же, я так понимаю, подразумевал под стартапом именно что просто новый бизнес, связанный с новыми технологиями (где-то как здесь написано: http://habrahabr.ru/blogs/star.../)

  • Введение в многоэтапное метапрограммирование и метаязыковую абстракцию

    ctapbiu.mabp.myopenid.com: Примеров можно привести много, но для того, чтобы многие из них воспринять, нужно быть чутьчуть в теме. В таких случаях для понимания реального выигрыша полезно увидеть дизайн какой-нибудь системы целиком, а не отдельный пример.Но один все же попробую привести: макрос меньше 10 строк, который управляет всеми действиями, связанными с установкой соединения с БД, пулингом соединений, а также использованием одного соединени для нескольких запросов. Естественно, использующий другие более низкоуровневые макросы. Его применение — в сотне или тысяче мест в коде, где выполняются запросы не нужно вообще знать ничего о том, с чем мы работаем: к примеру, с PostgreSQL, или Oracle, или вообще каким-то in-memory хранилищем, через сокет или библиотеку и т.д. Помнить нужно только, что весь такой код нужно обернуть в форму (with-dao...).

  • Введение в многоэтапное метапрограммирование и метаязыковую абстракцию

    Макс: ты знаешь, часто думаю над этим, когда пишу что-то новое в Емаксе, жму Tab и жду, чтобы он сам за меня закончил «фразу». Только название для него должно быть, наверно, dwit (do what I think):))

  • Введение в многоэтапное метапрограммирование и метаязыковую абстракцию

    2 Maxim Kizub: В идеале, гомогенное и гетерогенное программирование не должно противопоставляться. Это больше как 2 стороны одной медали. В рамках то го же Lisp это так и есть. Примером может служить Parenscript, который предназначен для генерации Javascript кода (т.е. явный пример гетерогенности), который является просто еще одной Lisp-библиотекой.Почему в таксономии написано, что только гомогенные системы могут быть многоуровневыми? Я могу это объяснить только с точки зрения практики. Если у вас есть среда, дающая полноценную возможность создавать DSL’и, то не имеет смысла (или во всяком случае, добавляет ненужную сложность) использование нескольких таких сред. Вы можете на всех уровнях системы производить преобразования, не выходя за рамки этой среды (разве что за исключением последнего, в котором может генерироваться код для целевой платформы). Хотя, чисто теоретически, в гетерогенной среде тоже можно реализовывать разные уровни на разных языках. Что-то вроде Fractal Programming: http://olabini.com/blog/2008/0.../. Оправдано ли это? Думаю, что в некоторых случаях (например, когда есть какие-то «legacy» или «enterprise» ограничения) да, но в общем случае, конечно, нет.Ну, а на счет того, что решать за пользователей, что им нужно. Это вы очень правильно заметили. К сожалению, так поступают в 95% случаев при создании языков и программных сред, в том числе и IDE. От этого, конечно, никуда не деться, поскольку все это создается для удовлетворения каких-то конкретных нужд и целей. Но правильный подход тут должен заключаться в том, чтобы всегда предусматривать возможность расширения, причем на уровне базовой системы, а не только как возможность создания надстроек над ней.

  • Введение в многоэтапное метапрограммирование и метаязыковую абстракцию

  • Введение в многоэтапное метапрограммирование и метаязыковую абстракцию

    Мы можем в лиспе a+2 записать как (+ a 2) — тогда это будет исполняемый код. А если для удобства работы DSL-компилятора этот код записать как (binary-expr (operation +) (left a) (right 2)) — то это уже просто данные, это не исполняемый код... Их даже невозможно унаследовать — это или фиксированные списки (массивы) где понятия индексированы, либо уже что-то более сложное — хэш-таблица, объект и так далее, но это не лисповское дерево кода.

    Не совсем так. Тут есть простое и сложное возражение.Простое: в Lisp’е есть keyword-параметры, т.е. вы можете написать (binary-expr: operation +: left a: right b) или наоборот (binary-expr: left a: right b: operation +: meta «huh? »). Кроме того, есть родовые функции, если вы хотите решать вопросы наследования, хотя я не совсем уверен, что они тут обязательно должны возникнуть.Сложное: вы же сами написали, что в Lisp’е код — это данные, а данные — код. Поэтому должны понимать, что никакого различия между (+ a 2) и (binary-expr (operation +) (left a) (right 2)) по сути нет. Обработку и того и другого можно выразить с помощью макросов, как и чего-угодно иного. И для вашего (binary-expr (operation +) (left a) (right 2)) можно написать довольно простое (хотя, как по мне, и чрезмерно сложное из-за того, что задача формулируется не вполне оптимально) решение:

    (defmacro binary-expr ((type arg) &rest args)  `(perform ',type ',arg ,@(let ((right-ordering (make-list 2)))                                (loop for (pos arg) in args                                   do (case pos                                        (left (setf (first right-ordering) arg))                                        (right (setf (second right-ordering) arg))))                                right-ordering)))(defgeneric perform (what which &rest operands)  (:method ((what (eql 'operation)) (which (eql '+)) &rest operands)    (apply #'+ operands)))CL-USER> (let ((a 2))           (binary-expr (operation +) (left a) (right 2)))4
    Собственно говоря, это и будет DSL.В общем, мне кажется, вы никогда не пытались применить Lisp для решения подобных задач на практике, а рассуждаете о нем на основании собственного теоретического и ограниченного представления. Как сказал Владимир выше:

    Хотя, для стороннего наблюдателя, очевидно, люди героически сражаются со сложностями, перепрыгивают барьеры, созданные ими же самими. Эта сложность не воспринимается людьми как результат использования не (совсем) адекватных инструментов. Сложность инструментов воспринимается как «естественная сложность метапрограммирования», ограничения инструментов приписываются «естественным ограничениям метапрограммирования».

    На самом деле на все ваши вопросы, если поискать, вы найдете ответы в Lisp’е, наверное, потому что пару десятилетий люди трудились в нем именно над тем классом задач, о которых вы пишите.

    «Окончательным решением» этой задачи (автоматизации программирования) является, очевидно, написание кода самим компьютером. Устранение кодировщика. Человек (программист) формулирует задачу, и в диалоговом режиме её передаёт компьютеру, а тот внутри себя чего-то думает, и выдаёт исполняемую программу.Так вот, чтоб это «окончательное решение» вообще стало возможным — надо, чтоб компьютер умел, мог, имел возможность манипулировать семантическими понятиями. В том числе и создавать и менять их. Компьютер должен «понимать», что значат те или иные действия в программе.Это не искуственный интеллект, это не создание новых знаний. «Понимать» — не значить уметь творить. Впрочем, это отдельный большой разговор.

    Что по вашему означает уметь творить, если это не «создавать что-то на основании своего понимания (знаний) "? Возможно, вы про спонтанный акт творения под влиянием вдохновения? Ну, стоит хотя бы заметить, что подавляющее большинство программирования к этой категории не относится.По-моему, вам стоит еще раз обдумать то, о чем вы говорите.:) Мне кажется, что вы отнекиваетесь от термина ИИ только из-за его непопулярности сейчас. По сути же ваш рассказ вызывает стойкую ассоциацию именно с ИИ, и в этом нет ничего плохого. Отрицая же это, вы, просто, заганяете себя в искусственные рамки и, скорее всего, вычеркиваете для себя часть накопленного опыта только на том основании, что это были попытки в области ИИ.Ну, а, если позволите, личное мнение на счет «устранения кодировщика». Суть Lisp-подхода (да и, в целом, метапрограммирования) именно в том, чтобы < quote> прогаммист формулировал задачу</quote>, а все остальное делал компьютер. Но, сформулировать задачу не всегда так просто, как сказать «сложи 2 и 2». Когда речь идет о сложных системах из множества компонент, взаимодействующих с другими системами, то сама формулировка задачи — это тысячи строк информации. Да, компьютер может устранить весь низкоуровневый и boilerplate код (и с этим прекрасно справляются макросы) и таким образом уменьшить код программы в десятки или сотни раз. Но сделать его еще меньше — это уже из разряда ИИ со всеми вытекающими последствиями, одним из которых является недетерминированность результата.

  • Введение в многоэтапное метапрограммирование и метаязыковую абстракцию

    Я бы сказал, что наоборот. Как раз очень многие увлекаются пониманием Lisp’а в таком аспекте, отсюда и такое множество Lisp-диалектов и философских размышлений, им порожденных. Не говорю, что это плохо. Отнюдь. Это значит, что Lisp дает возможность проявиться творчеству. К примеру, Gregory Chaitin (http://cs.umaine.edu/~chaitin/) с помощью Lisp’а вообще взялся исследовать границы математики...Но это не значит, что Lisp как язык (или группа языков, каждый со своими особенностями) не имеет ценности. И я в своей недавней статье здесь пытался показать некоторые практические его преимущества. К сожалению, в других языках попытка программировать так, как считаешь нужным, часто будет попыткой идти против течения, преодолевать ограничения, которые показались разумными их создателям или, что намного хуже, появились сами собой. В большинстве случаев этого не замечают, потому что, во-первых, привыкли к определенному способу мышления и шаблонам решений (не говорю, что они плохие или не эффективные, но нельзя объять необъятное), а, во-вторых, потому что постоянно появляется что-то новое, на осознание чего уходят те силы, которые иначе пошли бы на размышления о более эфективных и простых способах решения конретных задач. Хотя, сейчас наблюдаются определенные изменения (то, что Ola Bini, на которого я ссылался выше, и другие называют: language proliferation). Это в отличие от Lisp-среды, где просто стараются создать условия для того, чтобы программирование было удобным и эффективным в любой парадигме или вне ее. Для меня большим откровением, например, было прочитать в Practical Common Lisp про то, что нет ничего плохого в использовании глобальных переменных (с учетом того, что язык предоставляет инструменты их правильного использования). В Lisp нет табу, но всегда есть решение (а если его нет, значит, просто, никто еще не озаботился его созданием), которое направляет в нужное русло. А если вы хотите нарушать правила — вам виднее и у вас будет такая возможность.

  • Введение в многоэтапное метапрограммирование и метаязыковую абстракцию

    > Единственное, что понимает лисп как таковой, это (+ a 2), и всё.Это то же самое, что сказать, что компилятор C как таковой понимает только printf, но не понимает my_printf. Вы путаете стандартную библиотеку и язык. И, как верно заметил Владимир, кроме языка есть еще «окружающий его способ мышления».> У меня сейчас код проекта занимает при компиляции 100Mb в RAM и компилится полторы минуты. На лиспе это будет гигабайт и десять минут.Если вы перепишите код дословно, возможно и будет гигабайт, а, может, и 10 мегабайт. Как вам удалось прийти к такой оценке? Но, по-моему, то, о чем говорил Владимир — это предложение совсем не переходить на Lisp, а посмотреть на задачу с точки зрения метаязыковой абстракции, которая не обязательно должна опираться на Lisp (просто это язык, который лучше всего поддерживает такой подход). Это значит, начать решать ее в терминах предметной области, не думаю об ограничениях конкретной языковой среды, а затем подводить под это решение определенную базу алгоритмов и структур данных. (Это можно делать и на Java, просто не так безболезненно, поскольку при создании языка такая возможность не была приоритетом).

  • Введение в многоэтапное метапрограммирование и метаязыковую абстракцию

    > Мне вместо class BinaryExpr надо будет хранить class Property, class Node.Да нет, никто вас не заставляет так делать. Вы, по-моему, перепутали Class-based и Property-based наследование с Динамическими и Статическими языками (можете посмотреть на эту тему кратко здесь: http://lisp-univ-etc.blogspot...). Или вы имеете в виду, что внутренности так реализованы? Может, обычный CLOS действительно так работает (при стандартных оптимизационных настройках), но ничего не помешает вам с помощью мета-объектного протокола получить такую модель, которая вам нужна.Но вопрос, безусловно, в другом. Решать задачу в терминах предметной области значит подумать о BinaryExpr, Property или Node как таковых, не привязываясь к тому, что они являются объектами, функциями или еще какой-то категорией. Объекты — это ведь только один из распространенных шаблонов проектирования. Когда у вас будет готова высокоуровневая модель на мета уровне, тогда и нужно будет заняться выбором способов реализации на более низких уровнях. Возможно, на каком-то из них для этого подойдут объекты, может, замыкания или что-то еще. В этом то и отличие парадигмы метапрограммированием от других подходов.А какую модель метапрограммирования вы предлагаете? > Увы, при создании лиспа решение проблемы с ограниченностью ресурсов компьютера не была приоритетом.Тут вы ошибаетесь. Кстати, у SBCL один из самых оптимизирующих компиляторов (потомок компилятора, разработанного в CMU), и если ваша целевая среда — это Java, — то исполняемый код на Lisp будет быстрее (http://shootout.alioth.debian...).

  • Введение в многоэтапное метапрограммирование и метаязыковую абстракцию

  • Java EE сервер приложений

    2 Denys Bezsmertnyi: примером реализации приложения, наверное...

  • Интервью с Игорем Ашмановым

    2 Max: вы не оригинальны:) Почитайте вступление ко вторым правилам: http://www.ashmanov.com/pap/as.../

  • Женщина в информационных технологиях: профессионал или морская свинка?

    2 Podnos: На счет Ольги Леонидовны (она была у меня преподователем), могу сказать, что она действительно настоящий программист (они занимаются, например, разработками, связанными с компиляторами С++) с «мужским» складом характера (что называется, «пацанка» — дочь офицера, выросшая в послевоенные годы).Кстати, еще интересно то, что сама она, насколько я знаю была ученицей Ющенко, о которой вспоминалось выше. Да и в ее отделе в ИнКибе женщин намного больше, чем в средней программистской организации, управляемой мужчинами (даже если посмотреть по другим отделам ИнКиба). Это к тому, что, может, проблема не в IT-женщинах, а во многих IT-мужчинах-начальниках, которые часто расценивают женщин как ненадежных работниц (всегда может уйти в декрет, например), да и, к тому же, своим врожденным аутизмом отпугивают многих представительниц прекрасного пола;)

    Підтримали: Юрий Ющенко, anonymous
  • Использование языка Python для разработки научно-технического программного обеспечения

    2 COTOHA;) Хорошо про наследование Стиви Едж написал:

    For example, you may find a candidate who decides that a Vehicle class should be a subclass of ParkingGarage, since garages contain cars.

    http://steve.yegge.googlepages...

  • Гибкий подход разработки ПО — Scrum

    to krivitskyВы знаете, мне интересны многие вещи из agile подхода, и многие из них я считаю совершенно правильными.Но, вот, маркетинговая пропаганда всегда вызывает желание поспорить. Попробу. его реализовать;) > 1. выращивание узкоспециализированных специалистов (это происходит постепенно, когда PM оптимизирует раздачу задач, так чтоб росла локальная продуктивность: люди делают схожие задачи тем, которые они делали раньше); Задача нахождения баланса между общими и специальными навыками у работников не специфична для разработки ПО. Но, согласитесь, в целом мир движется к большей специализации.> 2. это в свою очередь приводит к мышлению в рабочей группе типа «я свое сделал...», это не командна, со всеми вытекающими; как раз задача PM сделать так, чтобы была команда, так ведь. И такое мышление — не самамя сложная проблема для решения.> 3. у PM-a растет число задач по микроменедженту своей группы, так как он является единственным человеком, который видит «всю картину»; какая связь между микроменеджментом и всей картиной? > 3. подключение новых людей становится задачей PM-a, текущие работники не заинтересованы в обучении новеньких — что им с того? это зависит от конкретной ситуации. Кто-то хочет работать с интересными людьми, еще какие-то соображения бывают. Также может быть и отсутствие заинтересованности к привлечению новых людей в скрам-команде.> 4. когда в итоге новых людей подключают, у PM-а работы только прибавляется; Закон Брукса?;) > 5. в итоге PM (а это особенные люди) занимается задачами ниже своего уровня компетенциикакими имеено? > вместо этого они могли бы заниматься: > а) развитием продутка; это функция менеджера продукта, а не менеджера проекта> б) формированием команды и устранением пряпятствий на её пути; как раз этим PM и должен заниматься. Что ему мешает? > в) высокоуправленческой функцией на уровне предприятия.а этим должен заниматься управленец соответствующего уровня. Для маленьких компаний, эта фнкция может оказаться совмещенной с функцией PM, но в общем случае, зачем? > теперь о проблемах по задачам и прогрессу проекта: 1. так как члены рабочей группы работают над своими задача (частями функционала), размеры задач и темпы работы людей разняться, то какая-то часть фич оказывается сделана частично; 2. что такое частично сделанная работа (фича) — это вливания инвестиций, которые не вернулись; 3. эти фичи нельзя потестировать и, если их много, то проект оказывается в состоянии «мы на половине проекта» или «50% фич сделаны наполовину»; 4. это непрозрачно и рискованно для инвесторов, заказчиков, подрядчиков — всех заинтересованных сторон.выход? да, частые релизы. Как это противоречит варианту, когда командой управляет PM? > это неуправляемый проект. титаник.если плохие руководители, то да. Но, это общемировая проблема. Качество менеджмента определяет всё. Скрам — серебряная пуля? > есть ещё проблемы, которые могут вытекать из классической модели управления., но даже, если их удается контролировать, такой подход не дает возможность людям (командам) раскрыть весь свой потенциал., а команды — это ценнейший фонд компаний, которые занимаются интеллектуальными разработками.почему не дает. А почему в футболе есть тренер, который направляет команду? Ведь там тоже это ценнейший фонд? > это как ехать на машине на второй передаче.ехать, конечно можно, но предел скорости весьма ощутим. плюс это неэкономно, гудит, да и другие машины обгоняют.ну, Камазы не очень быстро ездяют, зато много возят, а вот у феррари вообще багажника нет. И что мы друг другу продемонстрировали этими примерами?;) > приходите на PM-labs на наш доклад по этой темеплатное мероприятие (расчитанное на то, чтобы заработать за счет того, что у многих компаний есть бюджет обучения, который нужно куда-то девать)

  • Як платять в ІТ. Мінімалка, ПП та інше

    Якщо вже тиснути на когось, то це на державу, щоб податковий оверхед був не 50−55%, а 20−30%. Тоді і питань таких виникати не буде

  • Менеджмент highload проектов

    Не хватает конкретики в каждом примере: рефакторинг — это хорошо, команда — это очень важно и т.п. Неправда ли, общие фразы? Есть такой прекрасный сайт http://highscalability.com/, где постоянно разбираются кейсы конкретных систем. Хотелось бы прочитать о чем-то подобном (только на личном опыте или опыте каких-то наших команд, а не в переводе).

  • Уявна криза aутсорса, як воно є тут і там

    А что вы скажете о таком интересном направлении в embedded как FPGA и его перспективах в Украине?

← Сtrl 1... 789101112 Ctrl →