cookie

ما از کوکی‌ها برای بهبود تجربه مرور شما استفاده می‌کنیم. با کلیک کردن بر روی «پذیرش همه»، شما با استفاده از کوکی‌ها موافقت می‌کنید.

avatar

Test Engineering Notes

Україномовний канал про технічні аспекти тестування, розподілені системи, блокчейн та кібербезпеку.

نمایش بیشتر
پست‌های تبلیغاتی
3 188
مشترکین
+124 ساعت
-27 روز
+2930 روز

در حال بارگیری داده...

معدل نمو المشتركين

در حال بارگیری داده...

Про пошук роботи #interview Для багатьох людей пошук роботи = пошук вакансії на DOU/Djinni/Linkedin та подання на неї. Але чим вище у вас позиція та років досвіду, тим менше ефективності від такого пошуку. Що ще можна зробити, щоб підвищити свої шанси знайти роботу? Прокачайте свій Linkedin профіль (допоможіть рекрутерам знайти Вас) - Встановіть чіткий headline: в чому ви кращі, в чому ви спеціалізуєтесь? - Додайте опис кожної роботи та що конкретно ви там робили (можна написати навіть більше, ніж у вашому CV) - Застосовуйте ключові слова в секції summary - Приберіть нерелевантний досвід роботи Шукайте на Linkedin - продивіться вашу мережу контактів. Можливо хтось може зробити Вам рекомендацію. Або просто відповісти на питання про те, як працювати в тій чи іншій компанії - пошукайте цікаві продукти та компанії. Дізнайтесь яких спеціалістів вони шукають (або шукали нещодавно). - проаналізуйте вимоги вакансій - це допоможе зрозуміти ваші пробіли в знаннях та можливі варіанти росту - напишіть пост пошуку роботи в Linkedin (це краще працює, коли у вас вже є досвід роботи) А щоб оцінити свій рівень поточної ЗП - можна прийняти участь в літньому опитуванні від DOU.
نمایش همه...
Портрет і зарплатне опитування DOU, літо 2024

Не зраджуємо традиції і продовжуємо щопівроку збирати анонімні дані про зарплати українських IT-спеціалістів. Як завжди влітку, до зарплат додаємо ще опитування «Портрет ІТ-спеціаліста». Якщо ви зараз знаходитеся в Україні або переїхали за кордон через війну і плануєте повернутися, будь ласка, приділіть нам 10 хвилин і візьміть участь в опитуванні. Якщо ви зараз не працюєте, заповнюйте анкету з огляду на ваше останнє місце роботи. Результати опублікуємо в липні 2024 року. Підсумки попередніх опитувань можна подивитися тут: зарплатний віджет —

https://dou.ua/goto/M5JF

і звіти —

https://dou.ua/goto/B2JN.

Усі запитання, пропозиції та побажання щодо опитування надсилайте поштою на [email protected].

15👍 1
Про динамічність типізації #python #engineering Коли я ще писав на Java, я був в курсі, що існують статично-типізовані та динамічно-типізовані мови програмування. В динамічно-типізованих мовах, як-от Python чи Javascript, тип перевіряється під час запуску. Тому ніхто не забороняє писати щось типу такого:
x = 10       # x - integer
x = "Hello"  # x - string
Можна навіть написати функцію, яка буде працювати з різними типами
def add(a, b):
    return a + b

print(add(5, 10))        # Працює з integers
print(add("Hello, ", "Alex!"))  # Працює з strings
В статично-типізованих компілятор перевіряє правильність типів ще на етапі компіляції (до запуску коду). Приклад таких мови це C++, Java, C#. Тому компілятор буде скаржитись як на етапі визначення змінної
int x = 10;        // x - integer
x = "Alex";       // Compile-time error: incompatible types
так і при роботі з функціями:
public int add(int a, int b) {
    return a + b;
}

public static void main(String[] args) {
    System.out.println(add(5, 10));       // Works with integers
    System.out.println(add("Hello, ", "Alex!")); // Compile-time error
}
Погляд під іншим кутом Протягом якогось часу я просто думав, що Python динамічно-типізований так само, як JS та не переймався. Але в системі координат типізованості є ще одна вісь. Мова можна бути зі слабкою (weak) та сильною (strong) типізацією. Python - мова з сильною типізацією. Інтерпретатор все-таки слідкує за типами та може генерувати TypeError у випадках жорсткого порушення правил.
a = "Hello"
b = 5
c = a + b  # Спричинить TypeError: бо додавати можемо тільки str (не "int")

d = a + str(b) # Python вимагає явного перетворення даних
print(d) # Hello5
Те ж саме з функціями:
def add_numbers(a: int, b: int) -> int:
    return a + b

result = add_numbers(3, "4")  # Знову буде TypeError: unsupported operand type(s) for +: 'int' and 'str'
JS - це мова зі слабкою типізацією. Компілятор дозволяє як завгодно працювати з типами та багато чого робить "під капотом" - неявно. Саме через ці неявні перетворення в JS так багато "магії".
// звичайні динамічні типи
var a = 10;
a = "Now I'm a string";  // Тип a був змінений з number на string
console.log(a);  // Output: Now I'm a string

// JS робить магію
var a = "Hello";
var b = 5;
var c = a + b;  // Помилки не буде. JavaScript спробує сконвертувати b в строку та виконати конкатенацію
console.log(c);  // Hello5

// Інший приклад
var e = 1;
var f = "2";
var g = e - f;  // JavaScript робить число з f та віднімає
console.log(g);  // Output: -1
Висновок Хоч Python всі називають мовою, де можна як завгодно працювати з типами, це не так. Все-таки є в Python є деякі обмеження (може навіть на краще). Найбільша свобода все-таки в JS. Але найбільша свобода може бути причиною найбільшої "головної болі" та багів.
نمایش همه...

A site where we can all share in those little WTF moments we enjoy with Javascript

15👍 4
Магія пакування в Python #python Розпакування - то одна з найцікавіших "фішок" мови Python. Якщо у вас є tuple - то можна звичайно отримати доступ до елементів через індекс:
p = (4, 5)
first = p[0]
second = p[1]
Але можна - "розпакувати" tuple одразу в дві змінні
unpacked_first, unpacked_second = p
Можна розпаковувати більш складні структури:
data = ['ACME', 50, 91.1, (2024, 06, 18)]
name, shares, price, date = data
* дозволяє вказати - "а все інше запиши сюди 😁". Наприклад тут - в phone_numbers
record = ('Alex', '[email protected]', '123-456-7890', '124-456-0000')
name, email, *phone_numbers = record
Подібним чином можна розбирати строки (якщо ви точно впевнені в їх структурі):
line = 'nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false'
uname, *fields, homedir, sh = line.split(':')
_ дозволяє вказати, що ця частина даних несуттєва. Наприклад, отримати тільки імʼя та рік:
record = ('ACME', 50, 123.45, (12, 18, 2012))
name, *_, (*_, year) = record
З пакуванням звʼязаний відома задачка про те, як поміняти дві змінні місцями
a = 1
b = 2
a, b = b, a
Також, за допомогою рекурсії та розпакування можна писати такі функції
def sum(items):
    head, *tail = items
    return head + sum(tail) if tail else head
Як завжди - результати виконання кожного фрагменту:
first: 4, second: 5
unpacked_first: 4, unpacked_second: 5
name: ACME, shares: 50, price: 91.1, date: (2012, 12, 21)
name: Alex, email: [email protected], phone_numbers: ['123-456-7890', '124-456-0000']
uname: nobody, homedir: /var/empty, sh: /usr/bin/false
name: ACME, year: 2012
a: 2, b: 1
sum([1, 2, 3, 4, 5]) = 15
Весь код - тут.
نمایش همه...
Examples of unpacking in Python

Examples of unpacking in Python. GitHub Gist: instantly share code, notes, and snippets.

9👍 4🔥 3
Photo unavailableShow in Telegram
Що таке system of systems? #testing Система систем відрізняється від складної системи. Складна (complex) система, наприклад операційна система, може бути розроблена в одній організації. Система систем (system of systems) - це набір різних систем та компонентів, що працюють разом, але розробляються різними командами (компаніями). Кожна з команд чи компаній має свої технічні, економічні та фінансові цілі. Зазвичай, системи систем мають: - кілька рівнів зацікавлених сторін, подекуди з конфліктуючими інтересами - численні та суперечливі цілі - різні підходи до розробки, тестування та деплойменту - багато компонентів, кожен з яких зі своїми життєвими циклами - декілька точок прийняття рішень Для того, щоб тестувати такі системи, треба спочатку перевірити чи працюють підсистеми. Фактично, ми зустрічаємося з такими системами в роботі кожного дня. Бо сумніваюся, що у вас в компанії розробляють свої власні бази даних, брокери повідомлень та інші складні підсистеми.
نمایش همه...
21👍 3
The curious case of the missing period #engineering #bug В цю пʼятницю пропоную до вашої уваги історію про те, які проблеми може спричинити відсутність однією коми в листі. (та при чому тут SMTP протокол). Тим, хто тестує різного роду розсилки - це must-read!
نمایش همه...
The curious case of the missing period

When Simple Mail Transfer Protocol is not simple

👍 14
Коротко про базові типи даних в Python #python Сьогодні невеличкий розбір базових типів даних в Python. Здається, тема надто проста, але як завжди, є невеличкі деталі. Я наприклад не часто працюю з нескінченностями, тому не знав, шо у float можна отримати такі дані. Цілочисленні - int. Подивитись, який же найбільший integer можна з sys.maxsize
import sys

a = 100500
print(f"a = {a} та має тип {type(a)}")
print(f"максимальний розмір типу int: {sys.maxsize}")
Замість окремих float / double - Python має тільки float.
b = 123.456
print(f"b = {b} та має тип {type(b)}")
Крім float, є можливість працювати комплексними числами, а також з decimal / fraction.
c = 100 + 5j
print(f"c = {c} та має тип {type(c)}")

from decimal import Decimal
from fractions import Fraction

dec = Decimal("0.1")
print(f"dec = {dec} та має тип {type(dec)}")

frac = Fraction(1, 3)
print(f"frac = {frac} та має тип {type(frac)}")
Float дозволяє отримати трохи більш цікаві дані - такі як NaN чи нескінченність.
nan = float("nan")
print(f"nan = {nan} та має тип {type(nan)}")
inf = float("inf")
neg_inf = float("-inf")
print(f"inf = {inf} та має тип {type(inf)}")
print(f"neg_inf = {neg_inf} та має тип {type(neg_inf)}")
Якщо не подобається float, можна застосувати math. Результат той же.
import math
print(f"Те ж саме з math.inf - {math.inf == inf}")
Строки в Python бувають трьох типів - звичайні, сирі (raw) та форматовані.
single_quote_string = 'Hello, World!'
double_quote_string = "Hello, World!"
print(f"Python дозволяє строки з будь-якими лапками: {single_quote_string == double_quote_string}")

raw_string = r"\tRaw \n string"
well_done_string = "\tWell-done \n string"
print(f"raw_string = {raw_string}")
print(f"well_done_string = {well_done_string}")

formatted = f"{a} + {b} = {a + b}"
print(f"formatted = {formatted}")
print(f"formatted з фігурними дужками = {{{formatted}}}")
Результат в консолі:
a = 100500 та має тип <class 'int'>
максимальний розмір типу int: 9223372036854775807
b = 123.456 та має тип <class 'float'>
c = (100+5j) та має тип <class 'complex'>
dec = 0.1 та має тип <class 'decimal.Decimal'>
frac = 1/3 та має тип <class 'fractions.Fraction'>
nan = nan та має тип <class 'float'>
inf = inf та має тип <class 'float'>
neg_inf = -inf та має тип <class 'float'>
Те ж саме з math.inf - True
Python дозволяє строки з будь-якими лапками: True
raw_string = \tRaw \n string
well_done_string =      Well-done 
 string
formatted = 100500 + 123.456 = 100623.456
formatted з фігурними дужками = {100500 + 123.456 = 100623.456}
نمایش همه...
12👍 5
Queueing - An interactive study of queueing strategies #engineering Сьогодні хочу поділитись, мабуть, найкращим візуальним поясненням навіщо нам черги в computer science та в Web технологіях.
نمایش همه...
Queueing – An interactive study of queueing strategies – Encore Blog

In this blog, we go on an interactive journey to understand common queueing strategies for handling HTTP requests.

🔥 17👍 2
Знайти співробітників з найбільшою зарплатнею #python #interview #coding Всім привіт. Сьогодні я прийшов до вас із задачею. Цю задачу можна вирішити для тренування, а можна навіть дати на співбесіді. Бо задача вкрай нескладна та можна швидко отримати рішення. Відповідь покаже рівень знання мови програмування. Задача "Уявімо, що ви працюєте в HR департаменті великої компанії. Вам прилетіла задача написати новий ендпоінт, який буде повертати всіх співробітників, що мають ЗП більше, ніж $100,000 на рік. Поверніть результат у вигляді набору з двох елементів - імені працівника та його зарплати". Вхідні дані - це map такого вигляду:
employees = {'Alice': 100000, 'Bob': 99817, 'Carol': 122908, 'Frank': 88123, 'Eve': 93121}
Рішення буде наприклад таким:
top_earners = []  
for key, val in employees.items():  
    if val >= 100000:  
        top_earners.append((key,val))
print(top_earners)
Але існує трохи більш елегантне рішення, що показує можливості мови Python: ```
top_earners = [(k, v) for k, v in employees.items() if v >= 100000]
print(top_earners)
``` Або навіть:
top_earners = list(filter(lambda x: x[1] >= 100000, employees.items()))
print(top_earners)
Як бачите, на кожну проблему може бути декілька варіантів рішень. Але не забувайте PEP20 - "There should be one-- and preferably only one --obvious way to do it." А як буде виглядати рішення на вашій улюбленій мові програмування?
نمایش همه...
👍 18 2🔥 1
Корисне з GitHub - 6 #github #selection Доброго ранку! Сьогодні пропоную поглянути на декілька корисних підбірок з GitHub. 🛠 project-based-learning - для тих, хто вивчає мову програмування та не вистачає реальних задач для практики. 📚 The Algorithms - набір найвідоміших алгоритмів, що написані на різних мовах програмування. 🐧 The Art of Command Line - одна сторінка, що розповідає як працювати з командним рядком. 🆓 free-for.dev - величезний лист різних інструментів та сервісів, що допоможуть в розробці (усе безкоштовно). 🐍 30 Days of Python - покроковий туторіал з мови Python для тих, хто віддає перевагу самостійному навчанню. А тут - можна подивитись на купу корисних утиліт та невеличких програм (для натхнення).
نمایش همه...
GitHub - practical-tutorials/project-based-learning: Curated list of project-based tutorials

Curated list of project-based tutorials. Contribute to practical-tutorials/project-based-learning development by creating an account on GitHub.

🔥 17 6
Repost from DOU | QA
Photo unavailableShow in Telegram
Test Engineering Notes — Vol. 14: Про тестування сервісів в Meta, 10Х-інженерів та інтро в перфоманс-інженерію Пустий S3-бакет може завдати збитків на тисячі доларів, як писати коміт-меседжи та свій форматер коду, метрики перфомансу фронтенду, розбір різних структур даних в Python — це та багато іншого читайте у новому QA-дайджесті 👉 https://dou.ua/goto/Nr2V
نمایش همه...
🔥 11 2
До дайджесту 🚀
یک طرح متفاوت انتخاب کنید

طرح فعلی شما تنها برای 5 کانال تجزیه و تحلیل را مجاز می کند. برای بیشتر، لطفا یک طرح دیگر انتخاب کنید.