Source

blog / source / en_posts / 2012-07-12-regular-python-engineer.rst

Full commit
================================
 Regular Python Engineer Skills
================================

.. warning::

   This post is still in-progress. Please be patient and don't read it
   if you are lazy to re-read it when it's ready. When I'm finished, I
   will publish it on hacker news, reddits and so on, and if you are
   interested -- you will probably won't miss it.

.. note::

   In my company HR's saw a problem that there's very often case when
   some person is hired to a position of regular developer (that
   should be able to handle most of future project work by himself)
   with comment "he's cool, but has serious gaps in XXX". I was asked
   to write a document that would cover some most often basic
   knowledge areas for people who want to become regular python
   engineer. So, based on that comments, I'll try to write that doc. I
   believe it's best to show it to community, otherwise it would be
   just a wase of time.

.. note::

   You can improve this document by either writing a comment, or
   creating a pull-request to `this post's source
   <https://bitbucket.org/k_bx/blog/history/source/en_posts/2012-07-12-regular-python-engineer.rst>`_

This document aims to cover different gaps that regular engineer might
have, and ways to improve them in most common aspects. This document
is incomplete and should be updated with missing common needs for
regular python engineer.

Most of topics should cover lots of practical impact of typical python
engineer's tasks (also some topics assume web and can be skipped if
it’s not). Of course, list of literature is incomplete and should be
considered as a hint or starting point.

Testing
=======

Literature, libraries and software
----------------------------------

- `Testing topic on Django docs
  <https://docs.djangoproject.com/en/dev/topics/testing/>`_
- `Mock library <http://mock.readthedocs.org/en/latest/index.html>`_
- `Testinc topic in Flask docs
  <http://flask.pocoo.org/docs/testing/>`_
- `Selenium Simple Test <http://testutils.org/sst/>`_

Questions
---------

- What is functional/integrational/unit-testing? Describe the
  difference, needs and common problems.
- What are mocks? What’s they’re purpose? How do you use them?

Extra-points
------------

Imagine you have function create_consumer from module
``proj.consumer.bl`` that looks like this:

.. code-block:: python

    # module proj/consumer/bl.py

    from proj.consumer.model import Consumer
    from proj.email.consumer import send_welcome_email
    from proj.company.bl import add_company_employee

    def create_consumer(email, password, company=None):
        consumer = Consumer(email, password)
        if company is not None:
            add_company_employee(company, consumer)

        send_welcome_email(consumer)

Write such unit-tests for this function that make sure:

- consumer gets created
- ``add_company_employee`` gets called when company is not ``None``
- ``send_welcome_email`` gets called with consumer as parameter

Clean Hypermedia API Design
===========================

Literature, libraries and software
----------------------------------

- `Nobody Understands REST or HTTP
  <http://blog.steveklabnik.com/posts/2011-07-03-nobody-understands-rest-or-http>`_
- `Some People Understand REST and HTTP
  <http://blog.steveklabnik.com/posts/2011-08-07-some-people-understand-rest-and-http>`_
- `Classification of HTTP-based APIs
  <http://nordsc.com/ext/classification_of_http_based_apis.html>`_
- `http-headers-status.png
  <http://viswaug.files.wordpress.com/2008/11/http-headers-status1.png>`_

Questions
---------

- Describe main REST principles and restrictions.
- How would you implement flight ticket-ordering API?
- Why would it be bad to implement API via ``POST
  /order_ticket/from/Kiev/to/London``?

Extra-points
------------

You need to design API for your bookmarks list. Each of your bookmarks
has these fields:

* id
* title
* url
* tags
* date_created
* date_modified

Show how to list bookmarks. Add pagination, filtering by tags and
date-range.

Environment, Deploy & Automation
================================

Literature, libraries and software
----------------------------------

- `virtualenv <http://pypi.python.org/pypi/virtualenv>`_
- `PEP 3333 -- Python Web Server Gateway Interface v1.0.1
  <http://www.python.org/dev/peps/pep-3333/>`_
- `Fabric <http://fabfile.org/>`_
- `Deploying with Fabric
  <http://flask.pocoo.org/docs/patterns/fabric/>`_
- `Gunicorn <http://gunicorn.org/>`_


Questions
---------

- What is virtualenv? Why would you need it? How do you use one?
- What is WSGI? Why was it invented?

Extra-points
------------

Create a small hello-world project, serve it, write a deploy-cmd for
it.

Algorithms, complexity
======================

Literature, libraries and software
----------------------------------

- `Hash table <http://en.wikipedia.org/wiki/Hash_table>`_
- `B+ tree <http://en.wikipedia.org/wiki/B%2B_tree>`_
- `B+-Tree Indexes
  <http://www.cecs.csulb.edu/~monge/classes/share/B+TreeIndexes.html>`_
- `Python dictionary implementation
  <http://www.laurentluce.com/posts/python-dictionary-implementation/>`_

Databases, indexes, query profiling
===================================

pass