четверг, 6 августа 2020 г.

All about being Team Lead and building IT-team

I want to share with you my series of articles about leading IT-teams. The series will be replenishes by articles about IT leadership, employees motivation, teams structure, ways of working with business and about many others things.




That's all for now. Write me in the comments below what do you want to see in my future articles.

воскресенье, 22 июля 2018 г.

Ускоряем Python через cython


Python в настоящее время стал довольно популярным и универсальным языком. Во много благодаря своему удобному синтаксису, огромному количеству библиотек и простой расширяемости сишными модулями. Конечно когда говорят о скорости, все дружно морщат нос. Однако, в приложениях из реальной жизни, при привальном подходе, вы скорее упретесь в базу или сеть, чем в Python. Конечно есть всякие интересные вычисления, где интерпретатор дает большие накладные расходы и Gil не сильно радует, нет типов для возможных оптимизаций и упрощенного отлова ошибок. Все так, но не совсем. 

В python есть такая вещь как Type Hints. Мы просто можем указать типы данных для передаваемых значений в функции, а также типы возвращаемых значений.

def greeting(name: str) -> str:
    return 'Hello ' + name
Конечно, для интерпретатора, это мало, что значит. Основная идея была в улучшении подсказок в средах разработки, упрощенного анализа кода и поиска багов, может помочь вам писать код строже (потому что вы начнете соблюдать типы и думать о структуре кода, а не пихать все в одну переменную, если вы конечно так делали), так же это может помочь статическим анализаторам кода в нахождении проблем. Штука интересная, но не сильно помогающая в продакшене. Но на самом деле, теперь мы можем сделать очень интересные вещи для ускорения кода. И нам поможет Cython. В детали не будем залазить, возьмем простой пример показывающий общую суть.

def fun(x: float) -> float:
    return x*x-x

def integrate_f(a: float, b: float, N: int):
    s : float = 0
    dx : float = (b - a) / N
    for i in range(N):
        s += fun(a + i * dx)
    return s * dx
Вот пример нашего кода на питоне (прямо из документации). Проверяем:

begin = time.time()
print(tpy.integrate_f(1006, 2610, 100000000))
print(time.time() - begin)

Итог:
5584257516.163277
25.64701795578003

25 секунд, не очень радостное время. Однако, если мы переименуем файл в pyx и дополним тремя декораторами:

import cython

@cython.cfunc  # cdef functions are faster but not callable from python
def fun(x: float) -> float:
    return x*x-x

@cython.locals(i=cython.int, N=cython.int)  # better integration soon
@cython.cdivision(True)  # remove divide by zero protection
def integrate_f(a: float, b: float, N: int):
    s : float = 0
    dx : float = (b - a) / N
    for i in range(N):
        s += fun(a + i * dx)
    return s * dx

Как это добро компилировать смотрим в документации. Проверяем: 

import t (наш cython модуль)
import time

if __name__ == '__main__':
    begin = time.time()
    print(t.integrate_f(1006, 2610, 100000000))
    print(time.time() - begin)

Итог:
5584257516.166599
0.15540504455566406

Результат более, чем впечатляет. Затраченных усилий минимум и увеличение в поддержке кода не значительное. Конечно чем сложнее куски, тем сложнее будет соблюдать типизацию, некоторые вещи могут вообще не дать видимого прироста. Однако, если вы уперлись в Python, то можно попробовать использовать Cython для получения профита. В каждой конкретной задаче нужно смотреть оправданность усилий и полученного результата, но в целом профит может быть велик.

Для сравнения делаем в лоб одинаковое решение на go:

package main

import (
    "log"
    "time"
)

func fun(x float32) float32 {
    return x*x - x
}

func integrate_f(a float32, b float32, N int) float32 {
    s := float32(0.0)
    dx := (b - a) / float32(N)
    for i := 0; i < N; i++ {
        s += fun(a + float32(i)*dx)
    }
    return s * dx
}

func main() {
    start := time.Now()
    integrate_f(1006, 2610, 100000000)
    elapsed := time.Since(start)
    log.Printf("time %s", elapsed)
}


Получим 0,105165. В данном случаи выгрыш от cython не значителен. Я это к тому, что в каждой задаче хорошо свое решение и пытаться переписать все на go не решение всех проблем.

вторник, 26 января 2016 г.

Ставим Go на linux с официального сайта

Что-бы иметь самую новую версию языка, лучше ставить ее с официального сайта, а не из репозиториев вашего дистрибутива.

Качаем нужную версию:

wget https://storage.googleapis.com/golang/...

Распаковываем:

sudo tar -xzf goVersion.linux-xxx.tar.gz -C /usr/local

Прописываем пути к Go и папке проектов:

sudo vi /etc/profile
export PATH=$PATH:/usr/local/go/bin
export GOPATH="$HOME/workspace

четверг, 23 октября 2014 г.

quicksort на python

Описание алгоритма.

def quicksort(array):
    if len(array) <= 1:
        return arr
    else:
        return quicksort([x for x in array[1:] if x < array[0]]) + [array[0]] + quicksort([x for x in array[1:] if x >= array[0]])

вторник, 7 октября 2014 г.

алгоритм Евклида на python

Алгори́тм Евкли́да — эффективный алгоритм для нахождения наибольшего общего делителя двух целых чисел.

Подробнее об алгоритме читаем на википедии.

Пример реализации на python:

def evc(a, b):
    if a < b:
        a, b = b, a
    r = 1
    while r > 0:
        r = a % b
        a = b
        b = r

    return a

понедельник, 29 сентября 2014 г.

Запускаем android studion на ubuntu 14.04

При попытке запуска приложения на своём девайсе через android studio получил сообщение об ошиьке "ADB Not Responding ...".

Лечится просто:

sudo apt-get install lib32z1 lib32z1-dev lib32stdc++6

пятница, 28 марта 2014 г.

Оценка качества архитектуры проекта

Очень часто встречаю споры по поводу оценки качества архитектуры проекта. Видел много разных сложных метрик и громких заявлений. Моё мнение, что большинство вводит эти метрики для начальства или чтобы похвастаться перед другими. Я считаю, что нас должно интересовать 3 вещи:

  1. соответствует ли программа требованиям (т.е. выполняет все функции прописанные в техническом задании в полной мере);
  2. насколько легко лично для вас/вашей команды происходит процесс внесения изменений в систему;
  3. легко ли вы можете подключить нового разработчкика к работе над проектом.
Наверное можно придумать ещё метрики, но эти основные и без них никуда. Если ответы - да, легко, легко, то мне кажется что вы поработали над архитектурой должным образом. Если же нет, то вам есть куда расти.