Как стать автором
Обновить
6
0

Программист

Отправить сообщение

Проблема в том, что для получения газа надо тратить энергию, и кпд будет не 10-15% как у угля, а 0,1-1%. Вам оно надо? По экологии ударит куда как сильнее и результаты потомки еще будут расхлебывать.
Все это из разряда "экологически-чистых" автомобилей Тесла, кпд у которых не лучше, чем в ДВС, только в отличие от ДВС, который конкретно сейчас выделит Х углекислого газа — электромобиль сожрет энергии все на тот же Х (которая идет от тех самых теплых углесжигательных станций) + некоторая доля Х, требуемая для транспортировки, да еще при хранении утечки ЭЭ происходят во всех аккумуляторах. Я уже не говорю, что утилизировать использованный аккумулятор куда как сложнее, чем выхлопные газы, которые в худшем случае содержат небольшие примеси тяжелых металлов, от которых можно спастись обязав всех ставить фильтр на выхлопную трубу.


Попробуйте посчитать, что значит производить биотопливо в промышленных масштабах, а главное — откуда столько отходов взять? Вам потребуются тонны биоотходов (кто их сортировать будет?), что бы получить несколько кВт ЭЭ.


На 1/3 энергии от солнца и ветра нужно превратить огромные территории в зоны отчуждения похлеще Чернобыля, там вообще ничего не должно быть, совсем. К тому же на производство солнечных панелей нужно много ЭЭ, откуда ее брать? От солнечных панелей? У них КПД очень низок, а применять эти панели есть смысл только в солнечных широтах (тропики и экватор) и выдавать одна панель размером в 1 м2 будет пару Вт/ч.


Гидро-станции — вы представляете сколько нужно затопить территорий, что бы было 17% по всему миру?


ТЭЦ и АЭС занимают такой большой сегмент рынка ЭЭ в мире не из-за того, что какому-то политику что-то захотелось, а потому что это в разы дешевле, меньше вредит экологии планеты в целом (а не только в вашей любимой Хермании) и главное, что это все предсказуемо, планируемо. С солнечными панелями и ветряками у вас не только цена подскочит, но и упадет выработка энергии в среднем == убийство промышленности.
И не надо выдавать "экологически-чистые" технологии, спасающие экологию вашей страны за счет чьей-то другой, которая производит сырье для ваших "экологически-чистых" технологий.


Да вы хотя бы поинтересовались бы, что такое песочная мафия (Sand mafia), и какие законы принимают, что бы песок с пляжей не собирали.

Тссс, парень, первое правило либералов — никогда не говорить про жертвы репрессий халатности либеральной политики.

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


То что полезные фичи вносятся в джаву не говорит о том, что шарп хорош.
К шарпу у меня только одна претензия, которая на корню пилит ее использование — отсутствие кросс-платформенности (mono — это не c#, а опенсорсная разработка никакого отношения к мелкософту не имеющая).


Проблемы обратной совместимости шарпа (первая выдача гугла):
https://docs.microsoft.com/ru-ru/dotnet/framework/migration-guide/version-compatibility


Для джавы подобного не замечал, хотя переводил большой проект с 6 на 7, а затем и на 8.


На лохивар не затянете, сударь.

Их и там достаточно. Не говоря о том, что совместимость между версиями почти полностью отсутствует.


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


А кивать на костыли только ради перфекционизма… интересный выбор, но Ынтырпрайз держится на решении задач, а не написании кода.

Как пример: https://github.com/lastrix/asn1s/blob/master/asn1s-core/src/main/java/org/asn1s/core/type/x680/collection/SequenceType.java


Валидатору требуется для проверки NamedValue 4 обязательных константных аргумента и доступ к данным, класса SequenceType.
Предлагаете, что лучше устанавливать внешний валидатор, когда процедура проверки одна и не меняется? И в принципе не может изменится?
С method-object получается более компактный код.


Есть другой вариант парсер конфигураций 1С. В зависимости от типа объекта в xml, необходимо выполнять свою логику, причем она отличается сильно, но общего очень много.
у базового класса тонна информации, вроде около 10 полей (как констант, так и изменяемых), все необходимы при анализе. Часть создается в процессе анализа.
Раньше весь код представлял из себя кашу разных методов с 5-6 аргументами как минимум, сейчас 3 аргумента максимум и весь код разбит на функциональные блоки — вот конфигурируется документ, вот загружается контент из xml, тут определяются типы.
Про быстродействие даже говорить не хочется, оно просто в разы выше.
Хотя важнее именно повышение читаемости кода.


Или лучше иметь один класс (который в принципе нельзя разбить на независимые друг от друга классы без создания нереального количества мусорного кода), и 100+ методов в нем?


Если не страшно, вот пример из реального, работающего проекта, в исходном виде 1500 строк:


Часть класса
final class MetaDataMapper
{
    /**
        Огромное количество констант
    **/

    MetaDataMapper( VirtualFile file, 1СDocument sdk, 1СDocument target, @Nullable Element root )
    {
        this.file = file;
        this.sdk = sdk;
        this.target = target;
        this.root = root;
        resolver = new OneCv8ClassResolver( target );
        sourceFile = new SourceFileStub( file.getAbsoluteName().substring( 1 ), null );
        dummyDeclareStatement = DeclareStatementModifier.dummy( file );
    }

    private final VirtualFile file;
    private final SourceFileStub sourceFile;
    private final 1СDocument sdk;
    private final Element root;
    private final 1СDocument target;
    private final OneCv8ClassResolver resolver;
    private final DeclareStatementModifier dummyDeclareStatement;
    private ClassBuilder classBuilder;
    private List<ClassBuilder> transformationClasses;

    void mapElement()
    {
        if( file.getName().startsWith( "Subsystem." )
                || file.getName().startsWith( "WSReference." )
                || file.getName().startsWith( "CommonAttribute." ) )
            return;

        if( root.getTagName().equalsIgnoreCase( "Configuration" ) )
        {
            target.newClass( "System.Конфигурация.ЭтаКонфигурация" )
                    .parent( TYPE_CONFIGURATION )
                    .superClass( TYPE_CONFIGURATION.classReference() )
                    .declareStatement( asStatement( root ) )
                    .customData( ATTR_UUID, root.getAttribute( ATTR_UUID ) )
                    .build();
            return;
        }

        Element properties = XmlUtils.getSingleElementOrDie( root, TAG_PROPERTIES );
        Element innerInfo = XmlUtils.getSingleElementOrNull( root, TAG_INNER_INFO );
        Element internalInfo = XmlUtils.getSingleElementOrNull( root, TAG_INTERNAL_INFO );
        Element childObjects = XmlUtils.getSingleElementOrNull( root, TAG_CHILD_OBJECTS );
        Element standardAttributes = XmlUtils.getSingleElementOrNull( properties, TAG_STANDARD_ATTRIBUTES );

        resolveThisClass();
        transformationClasses = new ArrayList<>();
        if( innerInfo != null || internalInfo != null )
            new ClassTransformer( innerInfo, internalInfo ).doTransform();

        if( childObjects != null )
            readChildren( childObjects, standardAttributes, classBuilder, transformationClasses );

        if( properties != null && root.getTagName().equalsIgnoreCase( "Document" ) )
            registerDocumentSpecials( properties );

        notifyComplete();
    }

    void mapFormElement()
    {
        if( !root.getTagName().equalsIgnoreCase( "Form" ) )
            throw new IllegalStateException();

        resolveThisClass();
        FormAttributeReader attributeReader = new FormAttributeReader( classBuilder, transformationClasses );
        readFormAttrs( attributeReader, TAG_ATTRIBUTES, TAG_ATTRIBUTE );
        readFormAttrs( attributeReader, TAG_PARAMETERS, TAG_PARAMETER );

        Element elements = XmlUtils.getSingleElementOrNull( root, TAG_ELEMENTS );
        if( elements != null )
            new FormElementsReader( elements ).read();

        Element commands = XmlUtils.getSingleElementOrNull( root, "Commands" );
        if( commands != null )
            new FormCommandsReader( XmlUtils.getChildren( commands, "Command" ), asStatement( commands ) ).read();
        notifyComplete();
    }

    void mapPredefined()
    {
        if( !root.getTagName().equalsIgnoreCase( "predefinedData" ) )
            throw new IllegalStateException();

        resolveThisClass();

        for( Element item : XmlUtils.getChildren( root, "item" ) )
        {
            String name = XmlUtils.getTextContentOrDie( item, "name" );
            Element codeElement = XmlUtils.getSingleElementOrNull( item, "code" );
            String attrType = null;
            if( codeElement != null )
                attrType = codeElement.getAttribute( "xsi:type" );

            1CType type = StringUtils.isBlank( attrType )
                    ? getFieldType( item, "type" )
                    : resolver.resolveType( Collections.singletonList( attrType ) );

            classBuilder.field( name ).type( type ).declareStatement( asStatement( item ) ).build();
        }
        notifyComplete();
    }

    void mapTxtFile()
    {
        1CClassReference reference = resolver.buildClassStructure( file.getName() );
        if( reference == null )
            throw new IllegalStateException( "Unable to resolve class: " + file );

        classBuilder = target
                .editClass( reference )
                .modifier( dummyDeclareStatement );

        transformationClasses = new ArrayList<>();
        new PlainClassTransformer().doTransform();
        notifyComplete();
    }

    private void resolveThisClass()
    {
        1CClassReference reference = resolver.buildClassStructure( file.getName() );
        if( reference == null )
            throw new IllegalStateException( "Unable to resolve class: " + file.getName() );

        classBuilder = target.editClass( reference );

        Element properties = XmlUtils.getSingleElementOrNull( root, TAG_PROPERTIES );
        if( !root.getTagName().equals( "predefinedData" ) )
            classBuilder.declareStatement( asStatement( root ) )
                    .customData( ATTR_UUID, root.getAttribute( ATTR_UUID ) );

        String tagName = root.getTagName();
        if( FORMS.contains( tagName.toLowerCase() ) && isManagedForm() )
        {
            classBuilder.parent( TYPE_MANAGED_FORM )
                    .modifier( Modifiers.ENFORCE_PARENT_CLASS );
        }
        else if( properties != null && tagName.equalsIgnoreCase( "Constant" ) )
            registerConstantValueField( properties );
        else if( properties != null && tagName.equalsIgnoreCase( "SessionParameter" ) )
            registerSessionParameter( properties );
    }

    private void notifyComplete()
    {
        classBuilder.build();
        if( transformationClasses != null )
            transformationClasses.forEach( ClassBuilder:: build );
    }

    private void registerDocumentSpecials( Node properties )
    {
        ClassBuilder newRegisterRecordsCollection = createRecordsCollection();
        createSpecialFields( newRegisterRecordsCollection );

        Element registerRecords = XmlUtils.getSingleElementOrNull( properties, "RegisterRecords" );
        if( registerRecords != null )
            for( Element element : XmlUtils.getChildren( registerRecords, "xr:item" ) )
                registerDocumentSpecialMember( newRegisterRecordsCollection, element );

        newRegisterRecordsCollection.build();
    }

    private void registerDocumentSpecialMember( ClassBuilder newRegisterRecordsCollection, Node element )
    {
        String typeName = element.getTextContent();
        1CClassReference reference = resolver.buildClassStructure( typeName );
        1CClass aClass = reference == null ? null : target.getClassOrNull( reference );
        if( aClass == null )
            log.warn( "Failed to resolve: " + typeName );
        else
        {
            String name = aClass.getName();
            String memberTypeName =
                    OneCv8Types.NAMESPACE + '.'
                            + aClass.getParentClass().classReference().getName() + "НаборЗаписей." + name;

            1CType memberType = OneCv8Types.parse( memberTypeName );
            newRegisterRecordsCollection
                    .field( name )
                    .type( memberType )
                    .declareStatement( asStatement( element ) )
                    .buildField();
        }
    }

    private void createSpecialFields( ClassBuilder newRegisterRecordsCollection )
    {
        1CType type = newRegisterRecordsCollection.getReference().to1CType();
        for( ClassBuilder aClass : transformationClasses )
            if( REF_DOCUMENT_OBJECT.equals( aClass.getSuperClass() ) )
                aClass
                        .field( "Движения" )
                        .type( type )
                        .declareStatement( aClass.getDeclareStatement() )
                        .build();
    }

    @NotNull
    private ClassBuilder createRecordsCollection()
    {
        1CClassReference newRegisterRecordsCollectionReference =
                OneCv8Language.reference( REF_RECORDS_COLLECTION.getFullName() + '.' + classBuilder.getReference().getName() );

        if( target.getClassOrNull( newRegisterRecordsCollectionReference ) == null )
            return target.newClass( newRegisterRecordsCollectionReference )
                    .superClass( REF_RECORDS_COLLECTION )
                    .parent( REF_RECORDS_COLLECTION.to1CType() );

        return target.editClass( newRegisterRecordsCollectionReference );
    }

    private void registerSessionParameter( Node properties )
    {
        ClassBuilder paramClassBuilder = target.editClass( REF_SESSION_PARAMETERS );
        String name = Utils.getObjectName( properties );
        1CType type = getFieldType( properties, TAG_TYPE );
        paramClassBuilder
                .field( name ).type( type ).declareStatement( asStatement( root ) ).build()
                .build();
    }

    private void registerConstantValueField( Node properties )
    {
        1CType fieldType = getFieldType( properties, TAG_TYPE );
        classBuilder.field( "Значение" )
                .type( fieldType )
                .declareStatement( asStatement( root ) )
                .build();
    }

    private boolean isManagedForm()
    {
        Element properties = XmlUtils.getSingleElementOrNull( root, TAG_PROPERTIES );
        String formType = properties == null ? null : XmlUtils.getTextContentOrNull( properties, "FormType" );
        return "managed".equalsIgnoreCase( formType );
    }

    private void readFormAttrs( FormAttributeReader attributeReader, String tagName, String childTagName )
    {
        Element attributes = XmlUtils.getSingleElementOrNull( root, tagName );
        if( attributes != null )
            for( Element element : XmlUtils.getChildren( attributes, childTagName ) )
                attributeReader.read( element );
    }

    private void readChildren( Node childObjects, @Nullable Node standardAttributes, ClassBuilder primaryClass, List<ClassBuilder> secondaryClasses )
    {
        AbstractChildReader classFieldReader = new ClassFieldReader( primaryClass, secondaryClasses );
        AbstractChildReader tabularSectionReader = new TabularSectionReader( primaryClass, secondaryClasses );
        AbstractChildReader commandReader = new CommandReader( primaryClass, secondaryClasses );

        Collection<Element> children = XmlUtils.getChildren( childObjects );
        for( Element child : children )
        {
            String tagName = child.getTagName();
            if( ALLOWED_CLASS_FIELDS.contains( tagName.toLowerCase() ) )
                classFieldReader.read( child );
            else if( TAG_TABULAR_SECTION.equalsIgnoreCase( tagName ) )
                tabularSectionReader.read( child );
            else if( TAG_COMMAND.equalsIgnoreCase( tagName ) )
                commandReader.read( child );
            else if( !SKIPPED_CLASS_FIELDS.contains( tagName.toLowerCase() ) )
                log.error( "Skipping child object of unknown type - " + tagName );
        }

        if( standardAttributes != null )
        {
            Collection<Element> attributes = XmlUtils.getChildren( standardAttributes );
            StandardAttributeReader reader = new StandardAttributeReader( primaryClass, secondaryClasses );
            attributes.forEach( reader:: readAttribute );
        }
    }

    private 1CType getFieldType( Node properties, String typeTagName )

    private IStatement asStatement( Node node )

    private final class FormElementsReader
    {
        private final Element elements;
        private final ClassBuilder elementsSubClass;
        private final 1CClassReference parentClassReference;
        private final Deque<1CClassReference> eventTypeSource = new LinkedList<>();

        void read()

        void read( Node elementsNode )
    }

    private final class FormCommandsReader
    {
        private final List<Element> commands;
        private final ClassBuilder formCommands;

        void read()

    }

    private final class FormAttributeReader extends AbstractChildReader
    {
        @Override
        void read( Element element )
    }

    private final class SubTableAttributeReader extends AbstractChildReader
    {
        private final String className;
        private final 1CType parentClass;
        private final 1CClassReference pathToColumns;

        @Override
        void read( Element element )
    }

    private final class StandardAttributeReader
    {
        private static final String CUSTOM_DATA_KEY_ALIAS = "alias";

        private final ClassBuilder primaryClass;
        private final List<ClassBuilder> secondaryClasses;

        void readAttribute( Element attribute )
    }

    private static final class AttributeTemplate
    {
        private String name;
        private 1CType type;
        private final Collection<Modifier> modifiers = new HashSet<>();

        void addModifier( Modifier modifier )

        void setType( 1CType type )

        public void setName( String name )

        String getName()

        1CType getType()

        Collection<Modifier> getModifiers()
    }

    private abstract class AbstractChildReader
    {
        private final ClassBuilder primaryClass;
        private final Collection<ClassBuilder> secondaryClasses;

        ClassBuilder getPrimaryClass()

        Collection<ClassBuilder> getSecondaryClasses()

        1CType getXmlFieldType( Node properties, boolean useClassType, String typeTagName )

        abstract void read( Element element );

        void forEachClass( Consumer<ClassBuilder> callback )
    }

    private final class ClassFieldReader extends AbstractChildReader
    {
        @Override
        void read( Element element )
    }

    private final class TabularSectionReader extends AbstractChildReader
    {
        @Override
        void read( Element element )
    }

    private final class CommandReader extends AbstractChildReader
    {
        @Override
        void read( Element element )
    }

    private final class ParentMembersReplacer
    {
        private final ClassBuilder currentClass;
        private final Collection<1CClassReference> typesToReplace;
        private final 1CClass parent;
        private boolean typeReplaced;

        void copyMembersFromParent()

    }

    private class PlainClassTransformer
    {
        private ClassBuilder current;

        void doTransform()

        void doPrimaryClassTransformations()

        void produceType( String name, @Nullable String uuid, Modifier declareStatementModifier )

        void registerField( 1CClassReference classReference )

        void registerSubClass( String subClassParentName )
    }

    private final class ClassTransformer extends PlainClassTransformer
    {
        private final Element innerInfo;
        private final Element internalInfo;

        @Override
        void doTransform()
    }
}

Внутренности вложенных классов вырезал специально.


Работает это быстрее, чем прошлая реализация примерно в 2-3 раза (из-за других оптимизаций получилось намного выше). Просто потому что стэк не нагружается избыточной и ненужной работой, не говоря о том, что методы стали не по 100-150 строк в среднем, а по 50 максимум.
И загрузка десятка тысяч файлов xml не за 5 минут осуществляется, а за <30 секунд.


А вы говорите, что вложенные классы никогда нельзя применять.
С вашим подходом и синглтон — это убогий костыль, за который надо сажать и отбирать диплом.


Может все дело в том, что применять надо уметь инструмент? Знать где оно применимо?

PS а с inner-классами вообще беда-беда… они отвратительно влияют на читабельность родительского класса и допустимы в основном тогда, когда являются банальным представлением данных без средств обработки этих данных. Ну т.е. конструктор и геттеры… ну и опционально — сеттеры.

Почитайте что такое method-object.
У вас 10 параметров у функции, 9 из них всегда константы, а функцию вы вызываете много раз в цикле.
Вынести в вложенный класс и у вас будет большой конструктор и вызов метода с одним параметром. Это экономит стек.

Уже в том месте, где изначальный метр превратился в 6,5617 фута.
Из-за вот таких вот приколов самолеты падали, потому что заправляли-заправляли, а топлива на половину пути. То что вам кажется некомпетентным может на деле оказаться необходимостью конкретного случая.
Мы не говорили по поводу написания ТЗ. Так же как и на том уроке по дифурам — вам уже дали ТЗ, оно уже существует. Обсуждать его нечего.
Вы пытаетесь дать себе больше степеней свободы, что бы не напрягаться и сделать побыстрее, в то время как иногда ваше "побыстрее" может стоить млрд баксов при внедрении, и все из-за того, что вы сочли, что заказчик некомпетентен. Угадайте, будут ли вас нанимать?


Я вижу вы спорщик знатный, поэтому откланяюсь. То, что до вас пытался донести я и еще один человек до меня — вы понять отказываетесь. Все время на "заказчиков-идиотов" указываете, только вот мир немного иначе устроен. Не ч/б.
Желаю вам успехов.

Превосходно. У вас есть GPU (или любой другой специализированный вычислитель) и необходимо решить задачу через матричные вычисления, но у вас же есть "свои" методы, которыми вы успешно решаете на CPU.


Это провал Карл! Ваше решение не оптимально!


Дифуры и физика — это всего лишь инструменты, так же как CPU и GPU. И нужно уметь пользоваться ими, а не показать, какой вы молодец. И замечу — способность видеть множество решений — это только плюс вам. Но решение обязано подпадать под ТЗ. Иначе вы подставляете человека.


Просто подумайте, у вас попросили отмерить 1 метр оптоволокна, но вы решили, что отмерить 2 фута будет проще. Как потом быть заказчику? Смысл именно в инструментах и стандартах.

Это относится к функциональным языкам — у них есть своя специфика, которая и позволяет обходить глобальные состояния… за счет глобальных монад. Да что уж, предлагаю пойти дальше — класс, функция — это тоже глобальный объект, в своем роде. Только вот их глобальность скрыта ЯП и не доступна, обычно, программисту. Хотя умельцы патчат классы в рантайме прямо в виртуалке при загрузке этих классов — AspectJ как пример.


И да, как решение для ликвидации глобального состояния — ФОП отличное решение.
А в остальных случаях как? Или идеализм и перфекционизм вездесущи и все строем должны идти учить хаскель?

Ты решение из другой сферы взял, и при этом не достиг цели.
Вот если бы ты в контексте дифуров придумал свое решение, пусть даже менее элегантное — это было бы круто.


Ваш вариант — это в соревновании бега в мешках пробить в нем дно и бежать.
Решение не подпадает под заданную цель. Считайте это как ТЗ.


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


Где же в вашем первоначальном комментарии "правильно, как учили"?

Потому что о программах без глобального состояния проще

Не всегда.
Вы представляете себе, чем бы являлись системы логгирования, будь они строго локальны? Т.е. инициализация происходила бы на каждый класс?

Второе имя гениальности — краткость, первое — новизна.

В свое время так же занимался правкой багов во freecol. Одновременно писал к нему новый ИИ, который бы никогда не закончил.
Пока писал ИИ, с его помощью нашел баг в сервере.
В целом помощь в рефакторинге, исправил пару багов в клиенте и один в сервере.
Вроде бы участвовал только пару месяцев, зато очень хорошо помогло войти в курс дела разработки на Java. По времени ушло где-то 80 часов рабочего времени летом, а опыт использую до сих пор.


Если хотите чему-то научиться — ставьте себе невыполнимые задачи и шаг за шагом ее реализуйте. А опенсорс для этого самое лучшее начало. Гнаться за деньгами вот так вот сразу — бесперспективно. В любой области.

Допустим, что убираем checked. Вообще никаких исключений не видно, которые мог бы выбросить фреймворк, например для работы с http.
Что именно ловить? Checked исключения — это вариант возвращаемого значения с приятным бонусом в виде неявного завершения блока кода, вместо проверок возвращаемого методом кода (результата) — ловишь исключение. Это не только код упрощает, но и избавляет от нужды читать список констант (почему все упало) и пользоваться какими-то левыми инструментами, что бы получить детали.


А насчет заворачивания исключений многократно могу лишь сказать так: руки кривые и излишнее проектирование. Не каждый уровень бизнес-логики вообще требует какой-либо работы с исключениями.
Исключения не везде нужны. В лучшем случае в 1% функционала его требует обязательно, все остальное — проектирование ради проектирования.


Вот чего не хватает в Java, так это возможности сказать, что любые исключения в этом методе считать unchecked — как раз избавится от ручного управления списком throws. Современные IDE и компиляторы вполне умны, что бы понять какое исключение может быть в вызываемом методе и передать его выше. Для этого вроде как даже Java Reflections достаточно, информация присутствует.

Но для этого же существует суффикс при определении метода: throws И не нужно тогда ничего обрабатывать, при этом верхние уровни абстракции получат всю информацию о том, что использует ваша библиотека.

Насчет использования исключений в стиле goto не совсем согласен (ошибка 4), есть % тех случаев, которые просто требуют именно выброса исключений.
Как пример: Вы трассируете некую структуру данных (предположительно неограниченную — граф, дерево или список списков) и создаете собственную структуру данных с ограничением: не более N узлов.
Делать постоянные проверки на останов — снижение быстродействия более чем в 10 раз (такой код уже не будет оптимизироваться JIT даже если вы гуру в Java), не говоря о значительной потере читаемости такого кода, в котором везде и всюду if-else натыканы. С исключениями работает почти мгновенно. Разумеется исключение должно при этом иметь адекватное название, например TraceNodeLimitExceededException.
Так что ошибка 4 является ошибкой далеко не всегда.
Правильнее было бы назвать — рекомендация: "Не используйте исключения для управления ходом исполнения приложения, если нет значительной потери в быстродействии или читаемости кода."


Нет смысла лишать себя возможности сразу прекратить выполнение целого блока кода, если это позволит сделать код читаемым и не пестрить везде и всюду проверками.

На эльфах держится Objective-C объектная надстройка.

Бывают, конечно. Но зачем туда идти если есть возможность пойти в нормальную организацию? И нервы сохраняться, опыт сразу пойдет и по деньгам будет веселее. Гугл + голова зачастую помогает не пойти работать в болото.

Асоциальность и не туда затянуть может. Вы недооцениваете степень замкнутости людей и неспособность (нежелание?) понимать окружающих.


Не знаю никаких проблем с самоуважением. А рвать в гугл только ради престижа? Деньги? Иммигрировать? Личная жизнь? Вы о чем?


Ну пока учился можно хоть эникейщиком, хоть дворником в ИТ фирме работать, если других предложений нет (да студентов берут часто не охотно). Но вы предлагаете выпускнику идти целенаправлено в болото?

А зачем работать эникейщиком? Руки марать в пыли? К моменту поступления в институт я уже хорошо программировал. Лучше, чем 80% выпускников этого же ВУЗа. Но обучался-то один. Инет появился поздно. Книжка Попова по паскалю и дельфи-хелп + позже мсдн с msvs 2006-2008 где-то урвал. По ним и учился. Были еще книжки что-то в духе 50 приемов чего-то там от Майерса.


Маленькая зарплата — это так же и возможности. Просто взять и например послать начальника в пешее путешествие. Взять и сделать по своему… и еще и оказаться правым. Что бы управлять людьми не обязательно быть руководителем. Хотя по началу я себя очень скромно вел. Очень. Пока не начал понимать что к чему и как да почему.


Кому болото — трата времени и сил, а кому песочница, которую будешь крутить как захочешь (денег же не платят, а люди пассивны довольно, кроме слов и ругани ничего не сделают). Да — ненависти огребешь по полной. Но увольнять тебя принципиально не будут, причины же очевидны, напротив — с огромным трудом уволишься.
Зато поворошив это все поймешь как оно детально работает и почему (или наоборот почему не работает).


В гугле таких же болот хватает, только там ты будешь винтиком и система в целом сложнее, что бы ее изучать без подготовки. А то и вовсе никогда не поймешь как оно получилось именно так. И потерять можно не 1-2 года, а лет 10.
А прыгать с одной работы на другую, только потому что на новой больше предлагают? Иметь трудовую, забитую под завязку записями в 1 год? Зачем?
Я уже видел резюме людей, у которых 10 раз работа поменялась за 7 лет… Как жить-то, если ты сам болото?

мне не помешало с зп в 30к перейти в коммерцию и зарабатывать 120к.


Тут вопрос что ты делаешь в "болоте", тухнешь или пытаешься что-то изменить. Хотя бы себя.
Но разумеется для каждого свое.


И да, работал в этих предприятиях пока учился.
И вы очень сильно ошибаетесь. Такие же "болота" и в коммерции бывают. Причем чаще, чем кажется и им для этого не нужны приставки "НИИ" или "НИЦ".
Пока устраивался на новую работу повидался за 5 собеседований на эти зоопарки.

для начинающего программиста часто опасно "заразиться" ленью и разгильдяйством

Обычно для этого нужна почва. Сами по себе люди не становятся лентяями и разгильдяями. Если с детства к аккуратности и трудолюбию приучили — избавится сложно.


Я учил многих в коммерческой фирме. Это обычно окупается, так как специалист вырастает во много раз быстрее. Так что сильно зависит от фирмы, в некоторых наоборот будут стараться чтобы не научился, потому что им нужны манкидевелоперы за копейки, а опытных разработчиков хватает.

Проблема в том, что единицы не задают общий формат. А надеяться на чудеса — опрометчиво.
Манкидевелоперы обычно у не очень способных руководителей, коих более чем достаточно. А удержать опытного разработчика бывает сложно.
Вот что бы точно опознавать этих "неспособных" руководителей — и нужно идти работать в НИИ на пару лет, лучше еще во время учебы на полставки — посмотреть на них в живую. Только не надо этого делать с устоявшимся мнением, что там все такие — цель понять как одних от других отделять. Будет ощущение, что потерял время, зато прививка на всю жизнь. С ходу этих "эффективных" будешь распознавать. Это не только куроводителей касается. Вообще всего спектра специальностей ИТ.
А низкая зарплата только в масть в этом случае.


А теперь попробуй в коммерции, когда работать приходится очень много, заниматься такой социальной инженерией. Долго протянешь? Зарплату тебе не за исследование фирмы дают.

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Зарегистрирован
Активность