All streams
Search
Write a publication
Pull to refresh
25
0
Andrew Ka @comerc

#кодеротбога

Send message

Так я хочу и на ёлку влезть и попу не ободрать. Пусть тесты пишут генераторы и роботы, они железные. А я весь в белом сочиняю BDD, которые не только для тестов полезны, но и как документация в актуальном состоянии, и как декомпозированные таски etc.

Спасибо! Пойду по пути велосипеда. Убер превращает Go в PHP.

Ещё могу добавить кейс, поделился коллега. Есть школы, которые натаскивают джунов проходить сеньорские собесы за часть ЗП.

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

В юности на заводе наблюдал ролевую модель. Прораб - прокладка между бригадиром и начальником цеха. Пролетарии его не слушают, а руководитель требует.

Тимлид - медиатор между бизнесом и погромистами. Часто с низкой технической квалификацией, но с гордым званием "глава разработки". Я пришёл к тому, что нужно объединить в себе обе роли. Тим + Тех = Лид. Хочешь сделать хорошо? Сделай это сам.

Зацените, как надо устраиваться на работу. Хакеры, чо. ?

Спасибо! Исправил:

package main

import (
	"fmt"
	"sync"
)

type Counter struct {
	data  chan int
	total chan int
}

func NewCounter() *Counter {
	data := make(chan int)
	total := make(chan int)
	c := Counter{data, total}
	go func() {
		var count int
		for {
			select {
			case increment := <-data:
				count += increment
			case total <- count:
			}
		}
	}()
	return &c
}

func (c *Counter) Add(v int) {
	c.data <- v
}

func (c *Counter) Total() int {
	return <-c.total
}

func main() {
	counter := NewCounter()
	var wg sync.WaitGroup
	wg.Add(1000000)
	for i := 0; i < 1000000; i++ {
		go func() {
			counter.Add(1)
			wg.Done()
		}()
	}
	wg.Wait()
	fmt.Println(counter.Total())
}

package main

import "sync"

type Counter struct {
	data  chan int
	total int
}

func NewCounter() *Counter {
	data := make(chan int)
	c := Counter{data, 0}
	go func() {
		for {
			increment := <-data
			c.total += increment
		}
	}()
	return &c
}

func (c Counter) Add() {
	c.data <- 1
}

func main() {
	counter := NewCounter()
	var wg sync.WaitGroup
	wg.Add(1000000)
	for i := 0; i < 1000000; i++ {
		go func() {
			counter.Add()
			wg.Done()
		}()
	}
	wg.Wait()
	println(counter.total)
}

Внутри канала тоже mutex, кстати.

Говорить что в Go нет lock-free структур данных и топить за mutex это значит полностью не понимать CSP и идиомы Go связанные с многопотоком. Ещё раз: гуглим go proverbs, читаем первую. Там будет "Don't communicate by sharing memory, share memory by communicating".

Задача: Реализовать структуру-счетчик, которая будет инкрементироваться в конкурентной среде. По завершению программа должна выводить итоговое значение счетчика.

Условие: Решение без применения примитивов из пакета sync, исключительно используя канал для обеспечения потокобезопасной передачи/приёма данных.

Пытаюсь научиться лучшим практикам - никак. Помогите!

А где бы взять инструкцию, как правильно заполнять Green Card?

Поправил на "аджайлистов". Мне очень нравится идея притянуть это всё к BDD. https://eventmodeling.org/posts/what-is-event-modeling/ (на Хабре уже есть перевод, но настолько корявый даже по сравнению с моими, что лучше смотреть в оригинале).

filepath.Walk(".", visit) применяет такое же решение:

func visit(p string, info os.FileInfo, err error) error {

if err != nil { return err }

fmt.Println(" ", p, info.IsDir())

return nil

}

В мамбе такое было 15 лет назад.

Вы отказались от Nakama в Balancy?

очепятка на картинке с красными и синими квадратиками. в правом верхнем углу должен быть "Event Storming" а не "Event Sourcing", см. оригинал: https://threedots.tech/post/software-dark-ages/system-thinking-solved.jpg

Information

Rating
Does not participate
Registered
Activity