Wednesday, March 31, 2010

Spolsky: Duct Tape Programmer

Джоэль Спольски
Среда, 23 сентября 2009 года

Джемми Завински (Jamie Zawinski) – это тот, кого я бы называл «утилитарным программистом». (Duct Tape Programmer) И я скажу это с большой долей уважения. Он представляет собой разновидность программиста, который усердно трудится над построением будущего, и делает полезные вещи так, чтобы остальные люди могли заняться другими вещами. Он является тем парнем, которого вы хотите заполучить в свою команду по постройке картингов, потому что у него есть два любимых инструмента – изолента и WD-40. И он изящно орудует ими, даже если ваш картинг несется вниз по склону со скоростью одна миля в минуту. Это происходит в то время, когда другие программисты до сих пор находятся в начальной стадии спора о том, стоит ли использовать титан или некоторые виды композитных аэрокосмических материалов, которые Боинг применял для своей модели 787 Дримлайнер.
Когда вы закончите, у вас, возможно, будет грязный картинг, но я абсолютно уверен, что он полетит.
Я только что прочитал интервью с Джемми в книге «Программисты за работой», Питера Сибеля. Идите и купите её прямо сейчас. Это отличный набор интервью с рядом великих программистов, включая Питера Норвига, Гая Стила, и Дональда Кнута. Эта книга настолько интересна, что я потратил вчера 60 минут на беговой дорожке вместо обычных 30, потому что я не мог оторваться от чтения. Как я уже сказал, идите и купите её.

Идите! Я подожду.

Здесь написано, почему мне нравятся утилитарные программисты. Иногда, когда вы работаете в команде, и вы заняты набиванием кода, кто-то подходит к вашему столу, с кофейной чашкой в руке, и начинает нудить о том, что если вы будете использовать многопоточные компоненты COM, ваше приложение станет на 34% шустрее, и это совсем даже нетрудно, потому что он написал кучу шаблонов, и всё, что вам остаётся сделать – это отнаследоваться от его 17 шаблонов, примерно по 4 аргумента в каждом, и вам всего лишь надо будет написать тело функции.

Это просто огромный лист множественного наследования от разных классов, и эй, presto, многопоточный COM. И ваш взгляд затуманивается, и у вас нет ни одной чёртовой идеи, о чём этот чудак рассуждает, но он просто не хочет уходить, и, если даже он уйдёт, он просто вернётся в свой кабинет написать ещё больше своих классных классов, полностью собираемых из шаблонов множественным наследованием, без единого куска настоящего кода реализации, и это, похоже, будет виснуть по-черному, так что вы собираетесь записаться в ночную смену, чтобы прийти и попытаться разобраться с этим, потому что он будет на одном из чёртовых сборищ «Шаблонов проектирования».

А «утилитарный программист» не боится сказать: «Множественное наследование – хрень собачья. Прекрати это. Просто прекрати».
Видите, все остальные слишком боятся выглядеть глупыми, из-за того, что они просто не могут одновременно удержать достаточно фактов в своих головах, чтобы делать множественное наследование, или шаблоны, или COM, или многопоточность, или любую другую хренову работу. Так что они робко следуют за мимолётными программистскими поветриями, которые снисходят от астронавтов архитектуры, вещающих на конференциях и пишущих книги и статьи, и которые настолько более умнее, чем мы, что не могут понять, что их хрень, которую они продвигают, слишком сложна для нас.

Здесь то, что Завински сказал о Netscape – «Это было решение подобно отказу от использования C++ и не применять потоки, которое позволило нам поставить продукт вовремя».
Позже, он написал почтового клиента для Netscape, но команда, которая отвечала за правильный показ сообщения, так и не поставила свой компонент. «Это был просто большой пустой прямоугольник в центре окна, где мы могли бы просто показывать обыкновенный текст. Они были чрезвычайно академичного мнения о своём проекте. Они пытались достичь этого с помощью DOM\DTD… “О, ну, что нам нужно сделать, так это добавить ещё один уровень абстракции здесь, и иметь делегата для этого делегата того делегата. И в результате символы появятся на экране.»
Питер спросил Завински: «Чрезмерный инжиниринг, похоже, здорово раздражает вас?»
«Да», ответил тот, «В конце дня, сделайте эту чертову штуку! Было бы здорово переписать ваш код и сделать его яснее и с третьего раза он действительно станет классным. Но это не главное – вы здесь не для того, чтобы писать код; вы для того, чтобы поставлять продукт». Это мой герой.

Завински не делал много тестовых примеров. Они «звучат здорово в принципе. Если применять их при неспешном темпе разработки, так это точно то, что надо. Но, когда вы слышите: «Мы должны сделать это с нуля за шесть недель», то, я не могу сделать это, пока не от чего-либо не откажусь. И то, что я собираюсь выкинуть, так это то, что не является абсолютно критичным. Если там не будет тестовых примеров, заказчик не будет на это жаловаться» .
Перед тем, как вы пуститесь во все тяжкие, вспомните, что Завински работал в Netscape, когда они переворачивали мир. Они думали, что у них есть только несколько месяцев до того, как кто-то другой придет и отнимет их кусок хлеба. И масса важного кода написана подобным образом.
Утилитарные программисты – прагматики. Завински популяризировал рецепт Ричарда Габриэля – «Хуже – это лучше». На 50%-хорошее решение, , при помощи которого люди реально решают больше проблем и переживет 99-процентное решение, которое ни у кого нет, потому что оно до сих пор в вашей лаборатории, где вы ее бесконечно вылизываете.
Поставка – это опция . Действительно важная опция. Ваш продукт должен ее включать в себя.
Один принцип, которые утилитарные программисты хорошо понимают, это то, что любая разновидность техники кодирования, которая хоть чуть-чуть сложнее предыдущей, может оказаться роковой для вашего проекта. Утилитарные программисты стремятся избегать C++, шаблонов, множественного наследования, многопоточности, COM, CORBA, и кучу других технологий, которые очень даже резонны, когда вы думаете над ними долго и упорно, но они, честно говоря, просто слегка сложны для человеческого мозга.

Конечно, формально нет ничего плохого в том, чтобы пытаться написать многопоточный код на C++ под Windows с применением COM. Но это чревато таким катастрофическими багами, которые случаются только в очень специфических случаях, потому что наши мозги, честно говоря, не очень хороши для написания такого рода кода.

Обыкновенные программисты, откровенно говоря, отстаивают это, и не хотят признавать то, что они не способны написать этот суперсложный код, и они позволяют задирам из их команды отвлекать их каким-то Богом забытым архитектурным шаблоном на C++, а иначе, им бы пришлось признаться в том, что они просто не считают себя достаточно умными использовать то, что было бы превосходной техникой программирования ДЛЯ СПОКА (героя сериала «Звездный Путь»). Утилитарных программистов не заботит, что вы думаете о них. Они используют простые основные инструменты и напрягают мозги для того, чтобы эти инструменты позволили им писать более полезные вещи для их заказчиков.

Однако, одну вещь вы должны иметь в виду – то, что утилитарные программисты в программистском мире представляют собой эквивалент симпатичных парней…
таких фантастически красивых молодых людей, которые могут валяться на кровати, небритые, непричесанные, с нечищеными зубами, и входить в метро во вчерашних мятых брюках и выглядеть прекрасно, просто потому, что они такие.
Вы, мой друг, не можете выйти в люди непричесанным. Потому, что вы просто не так красивы. Утилитарные программисты должны обладать немалым талантом, чтобы отбросить эти ухищрения. Они должны быть достаточно хороши, чтобы поставлять код, и чтобы мы прощали им то, что они никогда не пишут тестовые примеры, или если они объединяют указатели «вперед» и «назад» в своем связанном списке в одно двойное слово, чтобы сэкономить 32 бита, потому что они достаточно хороши и умны, чтобы им это удавалось.
Вы еще не купили «Программисты за работой»? Идите! Это была всего лишь первая глава!


Tuesday, March 30, 2010

IPython

Cool tutorial:
http://showmedo.com/videotutorials/series?name=CnluURUTV
http://showmedo.com/club/joinus?smdc=socb

http://onlamp.com/pub/a/python/2005/01/27/ipython.html

Features

Magic

IPython has several "magic" keywords:
%Exit, %Pprint, %Quit, %alias, %autocall, %autoindent, %automagic, %bookmark, %cd, %color_info, %colors, %config, %dhist, %dirs, %ed, %edit, %env, %hist, %logoff, %logon, %logstart, %logstate, %lsmagic, %macro, %magic, %p, %page, %pdb, %pdef, %pdoc, %pfile, %pinfo, %popd, %profile, %prun, %psource, %pushd, %pwd, %r, %rehash, %rehashx, %reset, %run, %runlog, %save, %sc, %sx, %system_verbose, %unalias, %who, %who_ls, %whos, %xmode

Tab Completion

A very powerful feature in IPython is tab completion. If you are familiar with Python, you may be thinking, The standard Python interactive shell has tab completion. All you have to do is:
[jjones@cerberus ~]$ /usr/local/python24/bin/python Python 2.4 (#2, Nov 30 2004, 09:22:54) [GCC 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import rlcompleter, readline >>> readline.parse_and_bind('tab: complete') >>> 
That's correct. Both the standard Python interpreter and IPython support "regular" completion as well as menu completion. To use completion, type a pattern you would like the shell to match, followed by the Tab key. When in "regular" completion mode (the default), the Tab key will:
  • expand the pattern to as many characters as it can while still honoring the original match criteria
  • list all items matching that pattern
For example:
In [1]: import os  In [2]: os.po os.popen   os.popen2  os.popen3  os.popen4  In [2]: os.popen

Python IDE

  1. http://eric-ide.python-projects.org/index.html
  2. http://netbeans.org (current release - Netbeans 6.7)
  3. http://wingware.com
  4. http://www.wxpython.org
  5. http://www.thekompany.com/products/blackadder
  6. http://www.uxpython.com/overview
  7. Komodo IDE
  8. Sublime Text 2
  9. Eclipse
  10. JetBrains PyCharm
  11. CodeBlocks
Others: http://www.awaretek.com/toolkits.html



Installing Python with Netbeans IDE:
  1. Netbeans is available from early access site: http://dlc.sun.com.edgesuite.net/netbeans -  there are dedicated releases for Python, Ruby, etc.
  2. Wikihttp://wiki.netbeans.org/Python
  3. Pluginshttp://plugins.netbeans.org/PluginPortal

PyGUIa GUI API that is designed specifically for Python, taking advantage of Python's unique language features and working smoothly with Python's data types.

Tkinter
This default gui toolkit is installed when you install Python. It is mature, robust, and popular. You can be pretty sure that any user who has loaded Python can run any scripts you do using Tkinter. A very worthy toolkit; the standard bearer.

Easygui
Easygui is the easiest gui-creator known to man. It is based on the Tkinter toolkit and it uses the simplest, most intuitive syntax imaginable. Newbies should definitely try this out in order to get a sense of accomplishment. It is, however, mainly for use in obtaining data input from users and sending simple dialogs and other communication to the user. More complex requirements will require a more powerful toolset, but Easygui is still good for some useful and interesting tasks!

wxPython
wxPython is the "up and comer", the current challenger to Tkinter's throne. wxPython is a heavy-weight contender, with a great range of widgets that some find superior to Tkinter's. In addition, wxPython widgets have a more native look and feel on Windows than does Tkinter's widgets, since wxPython is built on top of wxWindows. On balance, wxPython is an excellent choice if you are using Windows. The tookit also works on Linux and Mac OS X, but is perhaps a bit more challenging to install than Tkinter.

PythonCard
My sentimental favorite, PythonCard is relatively new, but it is developing very quickly. PythonCard uses a "framework" model, based on wxPython, and seperates logic from presentation by using a "resource editor" file. PythonCard is very easy to learn and use, and it may be the ultimate gui-creator for Python someday. In the meantime, it is gaining in popularity and installation is easy and automatic on Windows. Installation on Linux and Mac OS X can be tricky for newbies, as you must install wxPython before you can install PythonCard.

Boa Constructor
A Gui Painter or Code Generator built on the wxPython toolkit, Boa Constructor development is still in Beta, but it ultimately offers the same kind of RAD, visual development tool as Visual Basic and Delphi, except it is also open source, free, and uses Python!

Wax
Wax is a GUI framework implemented as a layer on top of wxPython. Wax is a creation of Hans Nowak, noted Python hacker, and is intended to be simpler and easier to use than wxPython while maintaining wxPython's full power.

BlackAdder
A commercial GUI-Painter and IDE from theKompany, built on the Qt toolkit.. I have tried the hobbyist or home version, and it is really slick and inexpensive;, but you must have a good understanding of the underlying Qt toolkit to do any real work..

Anygui
is a unique project in that it allows you to create gui's by writing simple, python-type code that then automatically senses and uses whichever gui toolkit the user has installed on his machine, giving obvious advantages in universality. The syntax seems intuitive to me and easygui is being developed by an all-star caste of Famous Python Developers!

pyGtk
Based on the Gtk toolkit that underlies the Gnome environment for Linux and the GIMP, pyGtk is very powerful. There is a free gui painter available called pyGlade. pyGtk is great for use on Linux but is also good for Windows. pyGtk is powerful, professional grade stuff, but is not particularly easy.

Glade
a User Interface Builder for GTK+ and GNOME

Gazpacho:Next Generation GUI Design for GTK+ and GNOME
Jython
By using Jython, one gets easy access to the Java GUi libraries, SWING and AWT. In fact, using SWING or AWT is much easier using Jython than when using Java itself, because of the legendary ease of use of the Python syntax; however, you may have more difficulty porting your gui form the original environment in which you code it,m to another computer operating system than if you use Java. Still, it is portable, and relatively easy. I like playing around with Jython and SWIng, which is better than AWT. AWT however, has one advantage; it works on the Sharp Zaurus Linux based PDA, while SWING does not. Jython and SWING is a good choice of ruse on the Mac OS X., Linux, and also Windows.

HTML: 
Not a Python gui toolkit, but if you want to rub your Python code form a web browser using CGI, then creating a simple User Interface using HTML is the way to go.

FXPy
Uses the OpenGL toolkit and runs on just about any Unix and also on Windows.

pyFLTK
The Fast Light Toolkit is relatively easy for simple, lightweight guis. It runs on the openGL toolkit.

PythonWorks
A commercial gui-Painter and IDE, unfortunately discontinued by PythonWare. It was a first class product using the Tkinter toolkit. Unfortunately discontinued but see PythonWare's other fine products

TwiLight GUI
A GUI wrapper for wxPython, Tkinter, PyQT and PyGTK

Venster, a GUI Toolkit for Windows

Still more GUI toolkit options and information from the Python Wiki
Other GUI options:

vPython
is a really neat, easy to use toolkit for creating moving 3d graphics with Python. Highly recommended and fun to play around with!!!

PicoGui 
is a compact module for creating gui's on embedded systems and such small footprint devices. It runs on Linux and various PDA's, including the Sharp Zaurus.

IPython install


I have found the IPython command-shell particularly useful. It’s very well done, and has excellent documentation. Problem is, it doesn’t work so well on Mac OS X 10.5 Leopard. Your screen gets scrogged because of a Readline conflict (see the video). Here’s my cookbook for getting it to work – it’s way easier than all the other documents on the Internet lead you to believe.
  1. Installing IPython on Mac OS X is actually quite easy with the following command:
    sudo easy_install ipython
  2. Execute the command to load the right Readline library:
    sudo easy_install -f http://ipython.scipy.org/dist/ readline

Some references:

Powered by Blogger.