Source

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

================================
 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::

   On my current I was asked to write a document that would cover some
   basic knowledge areas for people who want to become regular python
   programmer, since there was often a situation when people were
   hided with comments "but still has lack of knowledge in XXX". 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.

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).

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.

Deployment & Automation
=======================

pass


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

pass


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

pass