Блог

Роль CTO (технического директора) в компании (англ.)

1. Architect

The CTO is the main architect of the software. This includes:

Choosing the technologies, language and infrastructure to build the product with.
Choosing the development tools, like IDE, source control, logging, tests, etc.
Designing the software architecture, modules, and components.
Building the dev roadmap, with coordination with the other founders regarding priority of features.
Deciding on coding standards and development protocols.
Writing and managing any software related documentation (for example company internal wiki page etc.).
Designing the Database. This includes choosing DB solution, designing its tables and data relations, design it to scale, etc.
Constantly exploring new tools and technologies to improve development efficiency and product quality.
When someone introduce a new tool or technology that integrates with the software or affect the dev cycle, the CTO must examine and approve or reject it.
When another founder or employee design a software component or a module, the CTO must review it and suggest changes if needed.
The CTO should have the final word on all design decisions, as he is the founder with the deepest understanding of the general architecture.
Exceptions:

Without diminishing the list above, its important to remember that some architectural decisions may have financial or scheduling implications. The CTO should not make decisions that exceed the budget or deadline.

2. Developer
Since it takes some time for a startup to start hiring devs, the CTO must also act as the main (and often only) developer on the team. At least until hires are made. This includes:

Developing the product itself, the MVP and other side experiments that the founders decide to test.
Testing the product and writing automatic tests when possible.
Overseeing any external development force (outsourcing, other founder temporarily coding, etc.).
If the startup provides a service or an API, the CTO should constantly monitor and assure its health and quality.
Breaking down development tasks and evaluating dev times and release dates. The CTO should also be responsible to learn and improve from scheduling mistakes.
Managing releases, tags, and versions history.
Developing or providing scripts and tools for the other founders.
As the startup grows bigger and the dev teams expand, the CTO work less as a developer and sometimes stop coding altogether. 
The involvement of the CTO in directly writing code should be up to him, provided he has enough time and resources to be coding (or there's a special justification for it).

3. Team Manager / VP Engineering
When the startup only starts to grow and hire, its the CTO's job to manage the dev team and act as the team leader as well as the VP engineering (until those roles are fulfilled). This includes:

Breaking down tasks for the dev team.
Training new employees and designing training program if possible.
Doing code & design reviews.
Making sure the dev team produce quality and tested code.
Making sure the dev team comply with the coding standards and protocols defined by the CTO.
Monitoring the devs progress and making sure they keep up with the roadmap.
Doing occasional talks with the team to make sure they are happy and in-sync with the company direction.
Building the culture of the dev teams.
Overseeing the entire dev cycle, from initial designs to delivery.
Helping devs with coding problems and challenges they can't handle. The CTO must be an exceptional developer and a problem solver that the team can relay on.
Recruiting and evaluating new hires. New programmers should not be hired without the CTO approval.
Being the direct supervisor of the technical staff.
Passing the Team Manager Role

On the event of hiring / promoting a Team Manager:

The team manager would report directly to the CTO.
On technical disagreements, the CTO will always have the final word.
The level of direct involvement of the CTO in the dev team would be subjected to the CTO choice.
The distribution of responsibilities and authority between the CTO and the team manager would be decided by the CTO.
The choice of the team manager must be approved and accepted by the CTO.
Passing the VP Engineering Role

On the event of hiring / promoting a VP Engineering:

The VP Engineering would report directly to the CTO.
On technical disagreements, the CTO will always have the final word.
The level of direct involvement of the CTO in the dev team would be subjected to the CTO choice.
The distribution of responsibilities and authority between the CTO and the VP Engineering would be decided by the CTO.
The choice of the VP Engineering must be approved and accepted by the CTO.
4. IT
Just like with devs, most startups start without a proper IT team. Its up for the CTO to take up that role until IT is hired. This includes:

Setting up and maintaining the company servers, databases, and all external services and tools.
Making sure the servers and data are secured and protected against common attacks.
Managing things like domains, SSL certificates, CDN, and other server-related and web components.
Managing the company's site, landing pages, and other misc services.
Helping the non techy founders with their general IT problems.
When the startup grows bigger usually some IT personnel is hired, and report to the CTO.

5. Founder & Executive
With all the roles and responsibilities above its important to remember that the CTO is also a founder and an executive-level personnel, and as such he is entitled to be involved in the strategy planning and big decisions of the company.

Источник: http://ctorole.com

cto

Как почистить кэш на macOS от оригиналов оптимизированных фото

  1. Проверьте в программе “Фото”, что все выгружено в icloud.
  2. Если программа “Фото” открыта, то закрываем ее.
  3. Заходим в директорию “Изображения” (в корне пользовательской).
  4. Правой кнопкой мыши на “Photos Library.photoslibrary” и выбираем “Показать содержимое пакета”.
  5. Заходим в директорию “originals”, выделяем все директории и удаляем их.
  6. Заходим в программу “Фото” и проверяем, что все в порядке.
macos

Отчеты времени по дням в Jira бесплатно

Устанавливаем плагин в Google Chrome (или аналогичный браузер).

https://chrome.google.com/webstore/detail/jira-assistant-worklog-sp/momjbjbjpbcbnepbgkkiaofkgimihbii/related?hl=en

Далее, переходим на сайт, где установлена jira, например, https://myjira.com.

Нажимаем на иконку Jira Assistant справа сверху у браузера и жмем зеленую кнопку Integrate. После этого нажимаем “Разрешить”. Если что-то не сработало, то перезагрузите страницу и нажмите Integrate еще раз.

После этого, через контекстное меню плагина переходим в меню “Worklog Report”.

Нажимаем на фиолетовую иконку “Add users” и вводим имя/email пользователя. Не забудьте нажать зеленую кнопочку с плюсом. После того, как добавили всех необходимых, нажимайте фиолетовую кнопку “Done”.

После того, как добавили всех необходимых, нажимайте на фиолетовую кнопку календаря и выбирайте нужный период.

Теперь вы видите отчет. Если нужно выгрузить его в Excel, то используйте фиолетовую кнопку с гаечным ключом.

jira

SCRUM and RACI

Всем привет!

При командной работе одна из важнейших частей - это понимание ответственности. Для описания ответственности за верхнеуровневые функции очень удобно использовать RACI.

  • R - ответственный - это лица, которые несут ответственность за выполнение работы.
  • A - подотчетный - это лица, ответственные за результат и лица, принимающие решение.
  • C - консультант - это лица, которые способствуют принятию решения (их вклад может быть согласован или не согласован).
  • I - информированный - это лица, которые проинформированы о решении, но не получают информации.
  • F - фасилитатор - это лица, которые помогают облегчить общение и передачу информации в команде.

Прилагаю также матрицу в формате PDF и исходники (Numbers , Excel).

RACI_SCRUM

Источник: https://techblog.constantcontact.com/software-development/scrum-and-raci/.

SCRUM бизнес

Советы начинающим владельцам Mac

Раскладка клавиатуры

Вы можете поменять раскладку клавиатуры на привычную, для этого выберите в настройках: Клавиатура -> Источники ввода -> Русская ПК (вместо просто Русская)

/media/uploads/2022/06/13/klaviatura_rus_pk.mp4

Оболочка по умолчанию

Мне больше нравится bash, но по умолчанию теперь zsh. Чтобы сменить обратно на bash, просто выполните в терминале команду:

chsh -s /bin/bash

Софт

Менеджер пакетов

Первым делом рекомендую поставить brew - с ним установка программного обеспечения становится гораздо проще.

Офис

Не торопитесь ставить офисный пакет Microsoft (Word, Excel), попробуйте Pages и Numbers от Apple. Они бесплатны и хорошо понимают форматы docx, xlsx.

Терминал

Вместо стандартного терминала рекомендую использовать iTerm2 https://iterm2.com, он гораздо удобнее.

Архиватор

Я использую Keka. Платный, но понимает все необходимые форматы, работает шустро и со своей задачей справляется на ура.

macos

Какие самые большие таблицы в MySQL?

SELECT CONCAT(table_schema, '.', table_name),
CONCAT(ROUND(table_rows / 1000000, 2), 'M') rows,
CONCAT(ROUND(data_length / ( 1024 * 1024 * 1024 ), 2), 'G') data,
CONCAT(ROUND(index_length / ( 1024 * 1024 * 1024 ), 2), 'G') idx,
CONCAT(ROUND(( data_length + index_length ) / ( 1024 * 1024 * 1024 ), 2), 'G') total_size,
ROUND(index_length / data_length, 2) idxfrac
FROM information_schema.TABLES
ORDER BY data_length + index_length DESC
LIMIT 50;

Источник: https://highload.today/vybor-samykh-bolshikh-tablits-iz-mysql/

mysql

Переходим на мессенджер Telegram

Telegram (телеграм, телега) имеет большое количество интересных особенностей, что выгодно отличает его от других мессенджеров (чатов). Расскажу вам, как настроить его под себя и на что обратить внимание:

Интерфейс

  • У телеграма есть возможность переключиться на русский язык. Для этого, при установке можно выбрать “Продолжить на русском” или позже нажать на гамбургер-меню (три полоски слева сверху), нажать Settings, в появившемся окне прокрутить вниз и выбрать язык в Language.

Поиск

Т.к. это мессенджер, то часто необходимо найти какое-то сообщение. В телеграме сообщение (а также файлы), можно найти множеством способов:

  • Для глобального поиска можно нажать на строку “Поиск” сверху слева - будет поиск по названиям и содержимому всех ваших групп и каналов, также будет осуществлен поиск по названиям публичных групп и каналов.

  • Для поиска в конкретной группе (на компьютере) выделите группу слева и нажмите Ctrl+F. Теперь поиск будет осуществляться только в этой группе. Для отмены - можете нажать Esc или нажать на крестик рядом с группой.

  • Для поиска в конкретной группе (на смартфоне) зайдите в группу, нажмите на ее заголовок и нажмите кнопку “Поиск”. Теперь поиск будет осуществляться только в этой группе. Для отмены - нажмите “Отмена” рядом со строкой поиска.

  • В телеграме есть поиск по файлам, изображениям, ссылкам - для этого нажмите на заголовок группы и выберите соответствующий пункт. Работает и на смартфоне и на компьютере. Кстати, если вы нажмете на значок “лупы”, когда просматриваете один из этих разделов, то поиск сузится только до него. Например, можно искать в определенном чате только по ссылкам, это поможет найти искомое быстрее.

  • Также, вы можете посмотреть, в каких еще группах вы пересекаетесь с человеком, с которым переписываетесь. Для этого, зайдите в чат с этим человеком, нажмите на заголовок чата и выберите пункт “Группы”.

Удобство

  • В телеграме есть “Избранное” (это то же самое, как в vkontakte пишешь сам себе). На айфоне нажмите на шестеренку настроек снизу справа – в меню увидите синюю закладку. На андроиде - кликайте на три полоски наверху слева и нажимайте на одноименный пункт меню. Можно хранить любые файлы и текст, он виден только вам.

  • Все важные файлы и сообщения вы можете пересылать в “Избранное”, для этого нажмите правой кнопкой на сообщении (или долгое нажатие на смартфоне) и выберите “Переслать”. После этого вы можете отправить это сообщение в любой чат, включая Избранное.

  • Также, вы можете использовать функцию “Ответить”. Аналогично, правой кнопкой на сообщении (или долгое нажатие на смартфоне) и выберите “Ответить”. Плюс использования этой функции - можно подниматься по сообщениям, чтобы увидеть всю историю “отвеченных”.

  • Если сообщение доставлено на сервер - у него одна галочка. Если прочитано - у него две галочки.

  • Вы можете скопировать изображение в буфер обмена (на Windows комбинация Windows + SHIFT + S) и с помощью комбинации CTRL + V на строке ввода сообщения сразу вставить в чат, без сохранения в файл.

  • Вы можете удалить или отредактировать свое сообщение, если отправили что-то не то. При этом, прошлое сообщение не будет видно. При удалении - оно просто исчезнет, при редактировании - для всех будет помечено как измененное.

  • Вы можете закрепить любой чат. Для этого нажмите правой кнопкой (или долгим нажатием на смартфоне) на нем и выберите “Закрепить чат”. Теперь он будет отображаться сверху всех чатов. Если закрепить несколько, то их можно перетаскиванием отсортировать в нужном вам порядке.

  • Аналогично, можно в любом чате закреплять множество сообщений. При этом, в группах закрепленные сообщения видны всем, а в личном чате можно выбрать, показывать ли. По нажатию на закрепленное сообщение - вы переместитесь к нему.

Уведомления

  • В любом чате можно выключить уведомления. Это полезно, чтобы в рабочее время вас не отвлекали сообщениями или если идет активная переписка, которую вы захотите прочитать потом. Заходим в любой чат, нажимаем на заголовок, листаем вниз и жмем переключатель “Уведомления” - чтобы выключить. Советую оставлять уведомления только в тех чатах, которые критично важны, остальное лучше потом самому почитать ;) На смартфоне уведомления находятся в пункте “Звук” (также, после клика на заголовок чата).

  • Если вам важно, чтобы человек получил уведомление с выключенным звуком, то используйте “обращение”. Просто поставьте собачку (@) и начните набирать имя человека. Будет подсказка, просто выберите ее из списка. Человек увидит это сообщение.

  • Если вы не хотите беспокоить человека именно сейчас, но важно отправить сообщение и не забыть (например, подумали ночью, что стоит что-то написать), то можно написать сообщение и правой кнопкой по “отправить” (или долгое нажатие на смартфоне) и появится выбор отложенного сообщения (можно запланировать на конкретное время, допустим на 09:00 следующего дня).

  • Отложенные сообщения можно отправлять и в “Избранном” - они будут действовать как напоминания. Работает аналогично, но видите их только вы.

Плюшки

  • Изображения можно отправлять как файлы (без сжатия) или как изображения (со сжатием). Можно отправить сразу несколько, они будут собраны в фотогалерею. Ограничений по количеству файлов нет. Максимальный размер файла на текущий момент - 2 гб. Да, можно и фильмы закидывать, если помещаются :)

  • В телеграме есть аудио и видеосвязь. Звонить могут любые пользователи друг другу (если не отключили в настройках). В группах звонить могут только администраторы. После того, как администратор группы начал аудио-/видеочат, то к нему могут присоединиться другие участники. При этом, по умолчанию подключается с выключенным микрофоном (синяя кнопка), по нажатию на кнопку будет включен микрофон (зеленая кнопка).

  • Если любите мемы или не хотите идти в гугл, то у телеграма есть специальные команды. Просто начните писать новое сообщение со слов @pic или @gif и через пробел начните набирать желаемое - вам будет предложено несколько вариантов, которые вы можете быстро отправить. Например, “@gif собака”.

  • В телеграме огромнейшее количество стикеров и все бесплатны. Есть обычные, есть анимированные. Для поиска нажмите на кнопку кружка с загнутым уголком, поднимите вверх и появится строка для поиска стикер-паков. Можно добавить стикер-пак к себе и общаться картинками :)

  • В телеграме есть опросы. Создать их можно только с компьютера. Для создания нажмите на три точки рядом с названием чата и выберите “Создать опрос”.

  • Если вам мешает какой-то чат, то вы можете отправить его в архив (как обычно правой кнопкой или долгим нажатием на смартфоне). Архив - это список чатов, который не занимает много место и у которых количество непрочитанных суммируется.

Папки

  • Папки позволяют отделить по смыслу ваши чаты. Например, можно создать такие папки - “Работа”, “Друзья”, “Мое”. Для создания перейдите в Настройки / Папки с чатами. В этом разделе можно создать эти папки.

  • Далее, заходите в любую папку и добавляйте чаты, которые хотите там видеть. Допустим, вы можете добавить рабочие чаты в в “Работа” и там будут только они. Если же у вас много рабочих чатов, то выберите “Контакты”, “Не контакты”, “Группы”, “Каналы”, “Боты”, сохраните и в списке ниже ИСКЛЮЧИТЕ чаты с вашими друзьями. Как видите, очень гибко можно настраивать видимость каналов. Далее, в течение рабочего дня у вас будут накапливаться чаты с друзьями и когда вы будете готовы пообщаться, то откроете эту папку и посмотрите, что вам писали.

  • Теперь к папке “Мое”. Довольно часто хочется разделить “Избранное” на несколько частей. Для этого вы можете создать приватный канал (сверху справа создание), нажмите “Создать канал”, введите название и переключите “Ссылка” на “Частная”. После того, как вы это создадите, никому не давайте ссылку на этот канал и вы можете ее использовать как дополнительное избранное. Можно создать несколько таких каналов и складывать туда какие-то свои файлы, фотосессии и все что вы не хотите потерять. Не забудьте исключить эти каналы из всех остальных папок, если это необходимо.

Советы

  • Файлы всегда остаются на сервере телеграм (если вы их не удалите сами), даже если вы очистите их с вашего телефона. Для уменьшения объема занимаемой памяти советую сделать следующее - Настройки / Данные и память / Использование памяти. В этом разделе “Хранить файлы” и “Максимальный размер кэша” поставьте в минимальное значение.

Вопрос/ответ

  • Чем отличается группа и канал? В группе можно писать сообщения, в канале вы только читаете их.

Если есть предлоджения, что еще добавить в статью, пишите мне https://t.me/crusat


grep со строками до и после найденной

Все просто, используйте параметры -A<число> и -B<число>, например:

grep -A5 -B5 searchstring
bash

Пример nginx + letsencrypt для docker-compose

Внесите в ваш docker-compose.yml следующие изменения и оставьте открытыми порты (80 и 443) только в сервисе nginx-proxy и добавьте VIRTUAL_HOST и LETSENCRYPT_HOST в environments в ваш сервис (или сервисы), который слушает 80 порт (можно использовать и другие порты/настройки, см. ниже):

version: '2'

services:

  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - 80:80
      - 443:443
    restart: always
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./vhost.d:/etc/nginx/vhost.d:ro
      - ./data/certs:/etc/nginx/certs
      - ./data/html:/usr/share/nginx/html
      - ./proxy.conf:/etc/nginx/proxy.conf

  nginx-proxy-letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    restart: always
    environment:
      - DEFAULT_EMAIL=crusat@yandex.ru
      - NGINX_PROXY_CONTAINER=nginx-proxy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /etc/acme.sh
      - ./vhost.d:/etc/nginx/vhost.d
      - ./data/certs:/etc/nginx/certs
      - ./data/html:/usr/share/nginx/html

  server:
    # ...
    environment:
      - VIRTUAL_HOST=example.ru
      - LETSENCRYPT_HOST=example.ru

  # ...

Создайте в корне файл proxy.conf:

# HTTP 1.1 support
proxy_http_version 1.1;
proxy_buffering off;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $proxy_connection;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto;
proxy_set_header X-Forwarded-Ssl $proxy_x_forwarded_ssl;
proxy_set_header X-Forwarded-Port $proxy_x_forwarded_port;

# Mitigate httpoxy attack (see README for details)
proxy_set_header Proxy "";

# additional
proxy_connect_timeout 3000;
proxy_send_timeout 3000;
proxy_read_timeout 3000;
send_timeout 3000;

Создайте файл vhost.d/default:

## Start of configuration add by letsencrypt container
location ^~ /.well-known/acme-challenge/ {
    auth_basic off;
    auth_request off;
    allow all;
    root /usr/share/nginx/html;
    try_files $uri =404;
    break;
}
## End of configuration add by letsencrypt container

client_max_body_size 200m;

Также, если необходимо несколько доменов, то можно добавить прокси по имену домена, например, vhost.d/example.ru:

## Start of configuration add by letsencrypt container
location ^~ /.well-known/acme-challenge/ {
    auth_basic off;
    auth_request off;
    allow all;
    root /usr/share/nginx/html;
    try_files $uri =404;
    break;
}
## End of configuration add by letsencrypt container

server_tokens off;
client_max_body_size 2000m;

Для дополнительной документации смотрите сюда: https://hub.docker.com/r/jwilder/nginx-proxy/

devops docker

Простой пример Apache Camel на M1

brew install maven
git clone https://github.com/camelinaction/camelinaction2.git
cd camelinaction2/chapter1/file-copy
mvn compile exec:java

По итогу, файл будет скопирован из data/inbox/ в data/outbox/

Код, отвечающий за это:

    public static void main(String args[]) throws Exception {
        // create CamelContext
        CamelContext context = new DefaultCamelContext();

        // add our route to the CamelContext
        context.addRoutes(new RouteBuilder() {
            public void configure() {
                from("file:data/inbox?noop=true").to("file:data/outbox");
            }
        });

        // start the route and let it do its work
        context.start();
        Thread.sleep(10000);

        // stop the CamelContext
        context.stop();
    }

Пример взят отсюда: https://habr.com/ru/company/redhatrussia/blog/352188/

apache camel java maven