Código aberto no Clojure

O Run Loop convida quem faz produtos legais com as próprias mãos. Nikita Prokopov ( tonsky ) - um homem e um navio, conseguiu fazer vários projetos de código aberto que outras pessoas gostam de usar.

Primeiro, vamos falar sobre a fonte FiraCode, Clojure e projetos completamente diferentes, por exemplo, o wrapper ClojureScript para React. E então vamos para discussões mais gerais sobre boas interfaces, bom senso e modelos de treinamento para programadores.



Sobre o convidado : Nikita Prokopov é notável pelo fato de ter criado o FiraCode, ter contribuído significativamente para o desenvolvimento da comunidade Clojure e publicado projetos como Datascript e Rum em OpenSource. Além disso, ele escreve no Objective-C no macOS: o programa AnyBar informará sobre a ocorrência de um evento na barra de status, oh, barra de menus do seu computador.

Apresentadores : Roman Busygin (desenvolvedor do Yandex.Music para iOS) e Alexey Mileev (App in the Air).

Nikita : Sou programador de Novosibirsk, mas agora moro em Moscou. Ele estava envolvido em projetos web principalmente, gosto de interfaces. Recentemente, tenho programado em Clojure.

Romano : Proponho construir a conversa de hoje em torno de seus projetos de código aberto e públicos. Quero começar com a primeira e mais interessante coisa para mim - é a fonte FiraCode . É usado por muitos dos meus colegas e por mim. Eu sempre fiquei interessado em como criar minha própria fonte, como isso acontece, se existe um programa especial, que conhecimento você precisa ter para criar sua própria fonte. Por favor, conte sobre isso.

Firacode


Nikita : Não é totalmente correto dizer que essa é minha fonte. Peguei a fonte monoespaçada pronta e as ligaduras, não desenhei as letras. Para escrever as letras, você precisa de muita experiência e perseverança. É muito difícil, existem um milhão de sutilezas sutis. Existem fontes amadoras e você sempre pode ver que elas são desajeitadas, mas nem sempre é claro o que é essa coisa desajeitada.

Peguei uma boa fonte FiraMono da Mozilla e desenhei ligaduras lá, existem vários programas para isso. Eu usei o programa Glyphs bastante popular. Como não sou especialista em design de fontes, observei o que os outros estão usando e também o usei. Pode ser uma surpresa que seja bastante caro, mas eles me deram uma licença para desenvolver o FiraCode. Glyphs é como um editor de gráficos vetoriais. Você abre, há letras, encontra células e desenha figuras. Além disso, todos os tipos de sutilezas associadas às fontes, por exemplo, que as letras têm tamanho, pontos de ancoragem, transições de negrito para não-negrito. Tudo é bem simples.

Curiosamente, dentro da fonte OpenType existe uma linguagem de programação com base na qual essa substituição de ligaduras é feita. Inicialmente, ele foi criado como um meio para a implementação de todos os tipos de truques em fontes. Por exemplo, ligaduras, quando fi, ffi e similares em fontes regulares são substituídas por ligaduras. Além disso, há variabilidade, estilos finais de letras: se uma letra está no início e no final de uma palavra, é adicionada alguma cauda. Tudo isso pode ser programado usando padrões complicados e também as ligaduras que ele fez.

Roman : Quanto tempo levou para finalizar o FiraMono para o tipo de FiraCode que todo mundo está usando agora?

Nikita : Vai ser difícil de calcular. A primeira versão não foi muito difícil. Como sempre, tudo começou rapidamente, mas levou algum tempo para descobrir o que estava acontecendo, como implementá-lo: não havia muitos exemplos.

Romano : Ou seja, havia também várias versões. Como eles diferem?

Nikita : Sim, e as versões estão sendo atualizadas. Em primeiro lugar, termino novas ligaduras, às vezes removo as antigas se elas entrarem em conflito. Em algum momento, o mecanismo para desenhar ligaduras mudou lá. No interior, há um problema algorítmico muito interessante: há uma longa sequência de caracteres, a partir da qual é necessário isolar as combinações que compõem as ligaduras, mas se elas se cruzam, deve haver outra substituição. Eu tenho até um programa Clojure que gera um conjunto de regras que são inseridas na fonte - bastante difícil. Isso mudou, o método de renderização de ligaduras mudou. Anteriormente, eles foram substituídos por um caractere, agora são substituídos por três. De fato, para o usuário, está ficando melhor, menos bugs, mais ligaduras.

Romano : Interessante. Eu nunca pensei que poderia haver erros nas fontes. As regras pelas quais o pintor decide quando inserir ligaduras e quando não são descritas em uma linguagem de programação especial ou simplesmente declarativamente?

Nikita : Declarativamente, e depois traduzida internamente com bastante eficiência na tabela de substituição.

Definido para a primeira versão das ligaduras


Roman : Diga-me, quando você criou um conjunto de ligaduras, olhou para alguma linguagem de programação específica ou existe uma lista mais ou menos geral do que as pessoas precisam na vida cotidiana?

Nikita : Eu não tive essa ideia. Vi que há uma fonte Hasklig feita especificamente para Haskell. Mas como eu não precisava do Haskell, pensei em criar a mesma fonte, mas primeiro com base na fonte que eu gosto e, em segundo lugar, em qualquer idioma. Então peguei tudo o que me ocorreu . As primeiras coisas são óbvias: <=,> =, ->, <-. Você escreve como em C, mas é substituído por uma seta. Na minha opinião, tudo isso começou.

Clojure


Alexei : No começo, você mencionou que está escrevendo no Clojure agora. Conte-me como você chegou ao Clojure, como tudo começou, como você chegou a esse idioma?

Nikita : Eu assisti algumas palestras de Rich Hickey (eu recomendo, por exemplo, isso e isso ). Eles são legais e versáteis no tópico de como a cabeça de um programador funciona, grosso modo, como projetar sistemas. As palestras abriram uma enorme quantidade de novas informações concentradas importantes para mim, e eu era fã de Rich Hickey. Então ele se interessou pelo que havia feito. Acabou que ele criou a linguagem Clojure. Fui ler, descobri tudo e lá vamos nós.

Roman : Eu também posso ser gravado como um fã de Rich Hickey. Vi suas performances: ambas são longas e, mais importante, interessantes. Ou seja, ele consegue manter a atenção dos ouvintes por um longo tempo.

Alexei : Do que exatamente você gosta no Clojure?

Nikita : Na última conferência, Rich Hickey fez a seguinte observação:

Clojure é uma linguagem para programadores mais velhos e cansados.

Eles não o procuram no início de uma carreira, mas ele se torna interessante após 10 a 15 anos. Primeiro de tudo, você tem liberdade absoluta. Tudo o que você precisa, você mesmo ou pega nas bibliotecas. Na própria linguagem, um mínimo de coisas é costurado . Tudo o mais que você cria, faz exatamente o que você precisa. Tudo é caseiro e pode ser alterado. Isso é perigoso quando você é iniciante, mas útil se você já é um especialista e sabe o que precisa.

Nesta linguagem, o pensamento é expresso da forma mais clara e compacta possível. Ou seja, a diferença mínima entre a complexidade do que você está tentando expressar e a complexidade de como está escrito. Em Java, por exemplo, você pode fazer algo completamente trivial, mas ele se estende por 10 linhas e você se cansa. No Clojure, se uma coisa é trivial, ela é escrita, provavelmente, trivialmente, em uma ou duas linhas.

Romano : Eu percebi que você respondeu minha pergunta. Quando soube que Clojure não impõe nenhuma restrição a você, por algum motivo, lembrei-me imediatamente de C, que também ficou de pé de alguma forma. Mas então ouvi a resposta de que, afinal, não é apenas o açúcar sintático, mas também uma linguagem conveniente e compacta que permite expressar seus pensamentos com menos código.

Nikita : Sim, é de nível muito alto e C é de nível baixo.

Alexei : Gostaria de saber se essa liberdade de linguagem não interfere no trabalho em grandes projetos com um grande número de pessoas. Ou no OpenSource, onde você precisa monitorar cuidadosamente cada alteração? Tanto quanto eu ouvi, no Clojure as coisas são permitidas até mudar a sintaxe do idioma . Isso não te incomoda?

Isso me lembra a situação com Scala, quando a linguagem sabe muitas coisas, e em todos os grandes projetos, todos estão envolvidos em algum tipo de rake. Como resultado, eles chegam a alguma prática comum, que a usamos, e isso não acontece. Como resultado, Scala em um projeto e Scala em outro são dois Scala diferentes . Existe um problema no Clojure?

Nikita : Eu não trabalhei em projetos particularmente grandes. Naqueles em que ele trabalhou, houve pequenas variações. De fato, por alguma razão, essa confusão direta não ocorre. Parece-me que isso ocorre porque no Scala, digamos, existem fãs para teorizar e especular sobre como fazer algo da maneira mais correta. Como você disse, há muito de tudo - você pode escolher não isso. Em Clojure, pelo contrário, não há muito - você não pode escolher a coisa errada. Esta é uma linguagem muito prática. Clojure não gosta de fazer abstrações para o futuro. Se você precisar imprimir alguma coisa, por exemplo, simplesmente imprima o mais prático possível e não se preocupe com a origem da impressora, com a interface e com o protocolo que está implementando. Você faz exatamente o que precisa. Portanto, essa praticidade é provavelmente um denominador comum.

Projetos na Clojure


Roman : Até onde eu sei, você tem vários projetos no Clojure no GitHub. Conte-nos mais sobre eles.

Datascript


Nikita : Meu primeiro projeto OpenSource relativamente bem-sucedido é o Datascript . Este é o armazenamento do cliente para o navegador. Provavelmente isso não é muito útil para o site, e se você estiver escrevendo algum tipo de aplicativo interativo no navegador, precisará armazenar os estados em algum lugar. Datascript é apenas um repositório para estados. Suas fichas:

  • Ele é imutável . Ou seja, ele não destrói as versões anteriores, apenas cria uma nova cópia do armazenamento com bastante eficiência.
  • Ele é classificado . Ele suporta automaticamente índices em atributos, em qualquer entity_id, e assim por diante. Ele permite que você encontre rapidamente tudo o que precisa. tudo que você precisa.
  • É plano . Se você realmente não pensou em como implementar o armazenamento no cliente, a primeira coisa a fazer é a estrutura do JSON aninhado. No Datascript, o armazenamento é simples, a qualquer momento você pode ir a qualquer lugar e encontrar o que precisa.

Em geral, esse é um acesso relativamente conveniente aos dados, bidirecional: você pode ir de pai para filho ou também de filho para pai.

Para a comunidade Clojure, ele tem mais uma vantagem: é feito com a mesma API do Datomic. Datomic é um banco de dados Clojure. Como eles têm a mesma interface, se você conhece Datomic, - você conhece o Datascript. Também existem consultas, você pode escrever consultas de dados na linguagem Datalog. Eu não achei esse recurso particularmente útil para a interface, mas há pessoas que acham útil nisso. Isso é semelhante ao SQL, você pode pavimentar as condições e obter resultados no repositório do cliente.

Roman : Informe-nos por que o Datascript é único. A tarefa de armazenar o estado no cliente em um aplicativo interativo é bastante comum. Parece que ele já deve estar incorporado em algum lugar na própria linguagem ou em algum tipo de estrutura. No entanto, você decidiu tomar sua decisão. O que o levou?

Nikita : Eu queria saber se eu poderia fazer pequenas ferramentas Datomic. Era um interesse repetir um sistema existente. Aconteceu que essa é realmente uma boa ideia, e é muito conveniente organizar e acessar o estado dessa maneira. Provavelmente existem soluções semelhantes no mundo do JavaScript. Existe algo como Relay. Tanto quanto me lembro, resolve o problema de sincronização e armazenamento de dados. Ela é um pouco parecida, mas, na minha opinião, apareceu mais tarde.

Rum


Alexey : Existe mais uma na sua biblioteca Rum . Conte-me sobre ela, por favor.

Nikita : Rum é apenas um invólucro do React para o ClojureScript. Reagir é legal, ótimo, e todo mundo gosta. Eu quero usá-lo b no ClojureScript para usar. Ele é um script Java, mas eu quero usá-lo no Clojurescript. Havia várias soluções no mundo ClojureScript, mas elas eram conceituais demais. Eles ofereceram seu modelo, que usou internamente o React. Isto é, não puro, mas seu próprio conceito, que usa React.

A idéia do Rum surgiu do fato de que você não podia usar o Datascript com esses fichários anteriores, mas eu queria usá-lo. Como resultado, cheguei a um design em que Rum é a ligação mais transparente e trivial ao React. Oferecemos tudo da mesma forma que no React, apenas em uma interface conveniente para o uso do ClojureScript. Não esconde nada, você pode acessar os componentes nativos do React. Ele é um agnóstico, como você gosta, e organiza o aplicativo e a arquitetura.

Roman : De acordo com as histórias de compositores familiares e, em geral, olhando na direção de React e React Native, vejo como o seu projeto está ganhando popularidade. Você disse que era o invólucro do React. Mas o React é um projeto enorme, e você conseguiu tornar o Rum muito pequeno sem estudar toneladas de fontes do React. Como você fez isso?

Nikita : React não é um projeto tão grande, na verdade. Todos os itens essenciais do React estão na biblioteca Preact, que ocupa apenas 3 KB. O React possui uma API bastante pequena, além de vários hacks para novos navegadores, faz pouco sentido aprender hacks, todos eles estão dentro do React.

Romano : O G6 faz parte do React ou não?

Nikita : Oficialmente - não, este é um componente separado.

Roman : Você portou ou deixou de lado?

Nikita : Não, eu não a transporto; você não usa no ClojureScript. No ClojureScript, o código é dado e tudo isso, você nem precisa de algo como o G6, você já tem sua própria sintaxe baseada em vetor, que é aceita na comunidade Clojure. Usando os dados, apresentamos o mesmo que é feito no G6 pela macro e pelo pré-processamento das fontes.

Romano : Uau! Agora, proponho mudar para o próximo projeto. Fiquei muito surpreso e encantado quando vi que você, Nikita, escreveu o projeto AnyBar - um aplicativo de barra de menus que mostra indicadores diferentes o tempo todo. Surpreendentemente, meu primeiro projeto MacOS também foi um aplicativo de barra de menus que mostrava notificações de novas cartas do Yandex.Mail. Eu olhei para a fonte e retornei diretamente para os últimos 8 anos atrás.

O projeto é muito simples e popular. Certamente, eles o usam para algumas tarefas aplicadas. Por favor, diga-me como o projeto apareceu, como você o usa, ou, talvez, você sabe como alguém o usa?

Anybar


Nikita : O projeto apareceu completamente por acidente. Você sabe, os programadores adoram escrever algo, e aqui. O código Clojure não precisa ser compilado; o código ClojureScript precisa. Sempre que você altera a fonte, ela é recompilada. Isso leva algum tempo: uma partida a frio leva de 30 a 40 segundos, por exemplo, e uma construção incremental de um segundo a dez segundos. Você alterou a fonte, mudou para o navegador e ainda não sabe se já pode assistir ou ainda precisa esperar, porque a fonte não foi compilada. Para saber disso, criei um indicador.

Todos trabalham principalmente em laptops, não há muito espaço para obtê-lo. Você precisa mudar para o terminal e aguardar até que tudo esteja compilado no terminal e depois mudar para o navegador. Para não ir ao terminal novamente, criei um indicador na barra de menus, que mostrava o status da compilação: ela compila, compila e compila com um erro. Se ocorrer um erro, você não precisará atualizar a página centenas de vezes, mas nada será aplicado.

Não fiz isso de uma maneira específica, mas fiz o mais universalmente possível. Para alterar a cor do indicador em AnyBar, você só precisa enviar um pacote UDP, esta é a maneira mais simples de comunicação cruzada. Acontece que isso é uma coisa super flexível, que é trivial para o script. Eu usei principalmente apenas para o status de compilação.

Alguém, por exemplo, twittou recentemente que ele havia feito um indicador do status de assentos vazios na embaixada. Para que você possa marcar uma consulta imediatamente, quando houver uma vaga vazia. Também foi exibido no AnyBar.

Roman : Nikita, isso funciona apenas no Localhost, ou minha máquina virtual na Holanda pode executar ping no meu laptop e exibir algo na barra de menus?

Nikita : Se você pode enviar um pacote UDP da sua máquina virtual para um laptop, então sim.

Alexei : Tendo ouvido falar sobre o tempo de compilação frio de 30 a 40 segundos e depois recarregado a quente por um ou dois segundos, é claro, só posso invejar do mundo Android. Mas aqui estou a pergunta: tudo isso foi coberto por um conjunto de scripts de shell prontos, plug-ins prontos que você nem consegue escrever, mas simplesmente conectados para que tudo funcione imediatamente?

Nikita : Não está crescida, porque não fiz muito. Estou até surpreso que alguém esteja interessado. Há muitas coisas: muitas idéias, muitos clones até. As pessoas querem exibir texto ou vários indicadores e assim por diante. Eu ia fazer tudo isso, mas minhas mãos não alcançaram.

grumpy.website


Alexei : Vamos para o seu próximo projeto. Diga-me o que é grumpy.website.

Nikita : grumpy.website é um blog sobre exemplos de interfaces ruins. Coletamos quaisquer batentes nas interfaces de computador e não-computador, discutimos, reclamamos deles.

Alexey : Há quanto tempo este site aparece?

Nikita : Cerca de um ano atrás.

Alexei : Quantas pessoas postam algo lá?

Nikita : Este é um projeto de um autor, agora temos quatro autores. Postamos principalmente, mas mais cinco pessoas enviam suas sugestões periodicamente. Este é um mecanismo totalmente personalizado, gravado no Clojure live no meu canal do YouTube . Levou no ar 13-14 questões, cujas descrições completas estão em Gist . Se você estiver interessado em como criar um aplicativo Web no Clojure do zero, poderá ver

Romano : Este curso já foi concluído ou o projeto ainda está sendo finalizado e você publica as notas à medida que está sendo finalizado?

Nikita: É mais um blog de vídeo. Terminou no estado em que o grumpy.website agora está localizado - em tempo real. O que está agora no site, depois no blog.

Design e usabilidade


Roman : Você, como a pessoa que criou o projeto sobre as estupidez do design de interface, provavelmente é versado em design e usabilidade. Como você entrou nessa área? Como você se interessou por isso?

Nikita : Aconteceu bem cedo, no início de uma carreira. Eu estava envolvido em projetos web, e me pareceu que, para fazer bem as interfaces, eu precisava entender o que estávamos fazendo. Havia a sensação de que nem tudo estava bem com as interfaces do computador.

Eu li vários livros famosos e tudo parecia bastante razoável. Por um lado, você precisa ficar de olho nas boas interfaces. Bom senso, por outro lado. Para ler o site grumpy.website , você não precisa ser um especialista na interface, o bom senso é suficiente para entender que isso é horror-horror.

Roman : Lembro que, depois de ler o livro “Design of familiar things”, de Donald Norman, comecei realmente a ver mais. Mas antes disso, usei essas bobagens, essas falhas e meus olhos não se agarraram.

Relatório AppsConf


Alexey : Nikita falará no AppsConf com o relatório " Aquisição de habilidades ". Nikita, diga-me como esse relatório apareceu.

Nikita : Eu assisti um relatório sobre o modelo driftfus. Este é um modelo para a aquisição de habilidades, segundo o qual cada pessoa, estudando um novo campo, passa por diferentes estágios: iniciante, competente, especialista, especialista, mestre. Fui ler, descobri quais são esses níveis, como eles diferem, descobri como isso se aplica à programação e tudo o que vejo sobre programação: cursos, livros, discussões na Internet, o design de linguagens de programação. Ou seja, é com relação a diferentes níveis de programador ou programação. Descobriu-se que este é um modelo interessante que explica muitas coisas. , , .

, : , . — , — . . , , , .

: , , , , , . , . , .
AppsConf — 8 9 . . ( : , ), .

YouTube- , .

Source: https://habr.com/ru/post/pt420147/


All Articles